Delphi 5.0 + WinAPI32 kerdes

Gabor Braun gbraun at lli.hu
Fri Mar 4 18:30:27 CET 2005


Hi,

Rosszul adod at a memoria blokk cimet a readfile-nak, ezert nem a megadott 
teruletre, hanem a stackon foglalt pmem pointertol kezdi atirni a memoriat.

Helyesen:
  b           := ReadFile( F, pMem^, Size, BytesRead, Nil);

csao,
gabor

----- Original Message ----- 

Jó reggel(i)t Mindenkinek!


Már két napja küzdök az alábbi problémával:
változó méretű (1kByte .. 1MByte) file-t kell beolvasnom a memória korábban 
lefoglalt területére.

Azért kell az obj-ban is megjelölt API hívásokkal küzdenem, mert a 
lefoglalt, majd a file byte-jaival feltöltött memóriaterület THandle típusú 
handle-jét (ezt a memóriafoglalást végző API függvény adja vissza) további 
adatfeldolgozás céljából át kell adnom egy másik függvénynek.

Na és most jön a tényleges gond:
tapasztalatom szerint ha a file mérete meghaladja a kb. 30kB-ot, az API-s 
ReadFile() függvény visszatérési értéke False lesz, a GetLastError() pedig 
998-as hibakóddal jelez hibát (ennek jelentése: Invalid access to memory 
location) a 0 hibakód helyett. Ugyanakkor a mem. foglalással semmi gond, sok 
megabyte-ig képes memóriát foglalni (tesz célból minden memóriafoglalás ill. 
kezelés után a GetLastError()-t meghívom, a kapott hibakódott 
MessageDlg()-vel kiíratom).

De itt van egy rövidített kódrészlet (igyekeztem a Windows API 
függvényeneveket konstansokat "eredetiben" használni):

---
Const
  FILE_NAME : PChar  = 'c:\projects\refete\exe\1.doc';

Var
  F           : Integer;
  Size        : DWORD;
  BytesRead   : DWORD;
  hMem        : DWORD;
  pMem        : Pointer;
  b           : Boolean;
  ErrCode     : Integer;

begin
  F           := CreateFile( FILE_NAME,
                             GENERIC_READ,
                             FILE_SHARE_READ,
                             Nil,
                             OPEN_EXISTING,
                             0,
                             0 );
  Size        := GetFileSize( F, @BytesRead );
  hMem        := GlobalAlloc( GHND, Size );
  pMem        := GlobalLock( hMem );
  b           := ReadFile( F, pMem, Size, BytesRead, Nil);

  ErrCode     := GetLastError;

  MessageDlg( 'ReadFile hibakód: ' + IntToStr(ErrCode),   mtError, [mbOk], 
0 );

  CloseHandle( F );
  GlobalUnlock( hMem );

---

Ha valaki tud, kérem adjon tippet, mi oka lehet annak, hogy a ReadFile() nem 
tud nagyobb file-okat beolvasni?

-- 

Üdv:
Moravcsik Szilárd
mailto:mszilard at contarex.hu




More information about the Elektro mailing list