GlobalLock i Pointer

0

Wywouję funkcję GetPrinter w następujący sposób:

var 
  aDevMode: PDeviceMode; 
  Device : array[0..255] of char; 
  Driver : array[0..255] of char; 
  Port   : array[0..255] of char; 
  hDeviceMode: THandle; 
begin 
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode); 
  aDevMode := GlobalLock(hDeviceMode);
end;

Wszystko fajnie działa. Pojawia się jedynie problem, gdy muszę zrobić w drugą stronę - tzn. mam już aDevMode, a muszę użyć SetPrinter:

var 
  aDevMode: PDeviceMode; 
  Device : array[0..255] of char; 
  Driver : array[0..255] of char; 
  Port   : array[0..255] of char; 
  hDeviceMode: THandle; 
begin 
  ...
  hDevMode := THandle(aDevMode);
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode); 
end;

Już nie działa... GetPrinter powoduje AccessViolation...
Co gorsza, czasem zadziała, ale przy zamykaniu aplikacji pojawia mi się okno CPU z komunikatem: Invalid Address specified to RtlFreeHeap

0

Tego tak się nie robi, nie wolno robić:
handle := THandle(pDev),
wskaźnik i uchwyt (deskryptor) to nie to samo.

handle := GlobalAlloc(flagi, size); // przydziela blok pam. i zwraca jego 'identyfikator'
ptr := GlobalLock(handle); // zablokowanie obszaru pam. i zwrot adresu

ptr^ := ... // wypełniasz danymi

GlobalUnlock(handle); // odblokowanie

Z tym SetPrinter daj sobie spokuj, to nigdy nie jest potrzebne - są inne i lepsze funkcje.

0

Ale to jest w drugą stronę... W ten sposób otrzymuję dane z Handl'a. A ja mam już dane i potrzebuję dostać Handla do niego...

Znalazłem coś takiego:

hDevMode := GlobalHandle(aDevMode);

ale niestety dzieje się to samo. Z tą różnicą, że okno CPU otwiera się po wykonaniu tej linii, a nie pod koniec działania programu...

Zrobiłem jeszcze coś takiego:

hDevMode2 := GlobalAlloc(GPTR, 1024*64);
aDevMode2 := GlobalLock(hDevMode2);
DevMode(aDevMode2^) := DevMode(aDevMode^);
Printer.SetPrinter(PChar(sPrinterName),'','',hDevMode2);

Póki co działa - nie wyskakuje żaden błąd, ale nie jestem pewien, czy to jest dobrze... Widzi ktoś w tym coś niepoprawnego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1