![]() |
auftretende Error bei nonVCL Fenster
Ich versuch mich grade mal an ein wenig nonVCL Programmierung, allerdings gibt mir
Delphi-Quellcode:
im angehängten Codestück beim Registrieren der Fensterklasse 2 (ERROR_FILE_NOT_FOUND) und beim erscheinen des Fensters 5 (ERROR_ACCESS_DENIED) aus.
GetLastError;
Ansonsten macht der Code was er soll (also keine Unterbrechungen). Ist das mehr oder weniger normal und kann ignoriert werden, oder sollte ich da besser etwas abändern? Wäre nett, wenn jemand mal schnell drüber schauen kann.
Delphi-Quellcode:
program nonVCL;
{$APPTYPE CONSOLE} uses SysUtils, Windows, Messages; var MyNoVCLClass: TWndClassEx; function WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := 0; case uMsg of WM_ERASEBKGND: begin DefWindowProc(hWnd, uMsg, wParam, lParam); //DC in wParam MoveToEx(wParam, 10, 10, nil); LineTo(wParam, 180, 180); Result:= 1; end; WM_CREATE: begin CreateWindow('Edit', 'AEdit', WS_VISIBLE or WS_CHILD, 80, 80, 100, 30, hWnd, 0, HInstance, nil); CreateWindow('Button', 'AButton', WS_VISIBLE or WS_CHILD, 0, 0, 100, 30, hWnd, 0, HInstance, nil); end; WM_DESTROY: begin PostQuitMessage(0); end; else Result:= DefWindowProc(hWnd, uMsg, wParam, lParam); end; end; procedure InitWindowClass; begin MyNoVCLClass.style := 0; MyNoVCLClass.cbSize := SizeOf(TWndClassEx); MyNoVCLClass.lpfnWndProc:= @WndProc; MyNoVCLClass.cbClsExtra:= 0; MyNoVCLClass.cbWndExtra:= 0; MyNoVCLClass.hInstance:= HInstance; MyNoVCLClass.hIcon:= 0; MyNoVCLClass.hCursor:= LoadCursor(0, IDC_ARROW); MyNoVCLClass.hbrBackground:= COLOR_WINDOW; MyNoVCLClass.lpszMenuName:= nil; MyNoVCLClass.lpszClassName:= 'MyTest'; MyNoVCLClass.hIconSm:= 0; RegisterClassEx(MyNoVCLClass); end; var MSG: TMSG; TempError: Cardinal; begin InitWindowClass; WriteLn(IntToStr(GetLastError)); //2 CreateWindowEx(WS_EX_WINDOWEDGE or WS_EX_CONTROLPARENT or WS_EX_APPWINDOW, 'MyTest', 'Caption', WS_OVERLAPPEDWINDOW or WS_VISIBLE, 200, 200, 250, 200, 0, 0, hInstance, nil); WriteLn(IntToStr(GetLastError)); //0 while (GetMessage(MSG, 0, 0, 0)) do //verzichte auf Überprüfung auf -1, da hier unnötig begin TranslateMessage(MSG); //nötig für Texteingaben DispatchMessage(MSG); TempError:= GetLastError; if(TempError <> 0) then WriteLn(IntToStr(TempError)); end; UnregisterClass(MyNoVCLClass.lpszClassName, HInstance); end. |
Re: auftretende Error bei nonVCL Fenster
Du solltest GetLastError nur dann aufrufen, wenn ein Fehler von einer Funktion aufgetreten ist, die den letzten Fehler auch setzt, denn ansonsten ist der Wert von GetLastError unbestimmt:
Zitat:
Delphi-Quellcode:
function InitWindowClass: DWORD;
begin MyNoVCLClass.style := 0; MyNoVCLClass.cbSize := SizeOf(TWndClassEx); MyNoVCLClass.lpfnWndProc:= @WndProc; MyNoVCLClass.cbClsExtra:= 0; MyNoVCLClass.cbWndExtra:= 0; MyNoVCLClass.hInstance:= HInstance; MyNoVCLClass.hIcon:= 0; MyNoVCLClass.hCursor:= LoadCursor(0, IDC_ARROW); MyNoVCLClass.hbrBackground:= COLOR_WINDOW; MyNoVCLClass.lpszMenuName:= nil; MyNoVCLClass.lpszClassName:= 'MyTest'; MyNoVCLClass.hIconSm:= 0; Result := RegisterClassEx(MyNoVCLClass); end; // ...; begin if InitWindowclass = 0 then Writeln(getLastError); // ...; |
Re: auftretende Error bei nonVCL Fenster
Hatte das zu Testzwecken so, wenn ich sie ohne Fehlschlag ignorieren kann, ist das kein Problem. Hatte mich nur irritiert, dass sie überhaupt gesetzt werden.
|
Re: auftretende Error bei nonVCL Fenster
ist Ganz normal denn die Funktion die du aufrufst ruft ja auch wieder andere auf:
Delphi-Quellcode:
Funktion Irgendwas1 ruft intern Irgendwas2 auf. Und Irgendwas2 kann widerum auch SetLastError aufrufen.
function Irgendwas1(): Boolean;
begin if Irgendwas2 then result := True else begin if GetLastError() <> FehlerXY then result := True else begin SetLastError(FehlerABC); result := False; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz