Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#1

GetLastError liefert Fehler, obwohl alles funktioniert

  Alt 28. Okt 2012, 10:39
Hallo Leute,

vermutlich stehe ich vollkommen auf dem Schlauch, deswegen wäre es schön, wenn mir jemand einen Weg von dort weg zeigen könnte .

Ich schreibe gerade an einer Idee rum, die mir gestern kam, als ich einen Weg suchte, Schrift/Text in ein Bild zu speichern und die Ergebnisse mit ImageMagick eher schlecht waren (mit Antialiasing verschwommen und ohne ziemlich pixelig). Das ist aber nebensächlich für das Problem.

Im Rahmen dessen benutzte ich heute erstmals die Funktionen GetDC und ReleaseDC und hatte aufgrund diverser Funde Schwierigkeiten, die Parameter richtig zu ordnen (mindestens ein Post in der DP zeigt die Parameter von ReleaseDC vertauscht). Deshalb erinnerte ich mich an GetLastError und SysErrorMessage, die ich einbaute, aber das fördert nun Überraschendes zu Tage:

Delphi-Quellcode:
uses ..., pngimage;

TMainForm = class
    btnPreview: TButton;
    Memo: TMemo;
    imagePreview: TImage;
  private
    pic_image : TImage;
    pic_png : TPngObject;
  end;

procedure TMainForm.btnPreviewClick(Sender: TObject);
var DC: HDC;
    gle: DWORD;
    rdc: integer;
begin
    rdc:= 0;
    gle:= 0;
    DC := GetDC(Memo.Handle);
    MessageBox(Self.Handle, PChar(IntToStr(DC)), nil, MB_OK);
    try
        pic_image.Picture.Bitmap.Width:= Memo.Width;
        pic_image.Picture.Bitmap.Height:= Memo.Height;
        BitBlt(pic_image.Picture.Bitmap.Canvas.Handle,
               0, 0,
               pic_image.Picture.Bitmap.Width, pic_image.Picture.Bitmap.Height,
               DC,
               -1, -1,
               SRCCOPY);
        imagePreview.Picture.Bitmap.Assign(pic_image.Picture.Bitmap);
        imagePreview.Update;
        gle:= GetLastError;
        MessageBox(Self.Handle, PChar(Format('%d, %s (%d)', [rdc, SysErrorMessage(gle), gle])), nil, MB_OK);
// --> gle ist hier noch 0
        pic_png.Assign(pic_image.Picture.Bitmap);
        gle:= GetLastError;
        MessageBox(Self.Handle, PChar(Format('%d, %s (%d)', [rdc, SysErrorMessage(gle), gle])), nil, MB_OK);
// --> gle ist hier 8 (Für diesen Befehl ist nicht genügend Speicher verfügbar)
    finally
        rdc:= ReleaseDC(0, DC);
        gle:= GetLastError;
        MessageBox(Self.Handle, PChar(Format('%d, %s (%d)', [rdc, SysErrorMessage(gle), gle])), nil, MB_OK);
// --> gle ist hier 5 (Zugriff verweigert)
    end;
end;
In den Kommentaren sieht man, was ich nicht verstehe. OK, die 8 nach dem Assign soll mir erstmal egal sein. Aber die 5 verstehe ich überhaupt nicht, denn die gibt GetLastError auch zurück, wenn ich ReleaseDC auskommentiere oder mit einem anderen HWND (Memo.Handle) ausführe. ReleaseDC gibt übrigens 1 zurück, gibt den DC also offensichtlich erfolgreich frei.

Kann mir das jemand erklären?

MfG Dalai
  Mit Zitat antworten Zitat