Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi auftretende Error bei nonVCL Fenster (https://www.delphipraxis.net/117547-auftretende-error-bei-nonvcl-fenster.html)

Cyf 20. Jul 2008 16:51


auftretende Error bei nonVCL Fenster
 
Ich versuch mich grade mal an ein wenig nonVCL Programmierung, allerdings gibt mir
Delphi-Quellcode:
GetLastError;
im angehängten Codestück beim Registrieren der Fensterklasse 2 (ERROR_FILE_NOT_FOUND) und beim erscheinen des Fensters 5 (ERROR_ACCESS_DENIED) aus.
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.

Luckie 20. Jul 2008 17:19

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:

Zitat von RegisterClassEx Function
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Also so sollte das bei dir aussehen:

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);
  // ...;

Cyf 20. Jul 2008 19:50

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.

SirThornberry 20. Jul 2008 21:38

Re: auftretende Error bei nonVCL Fenster
 
ist Ganz normal denn die Funktion die du aufrufst ruft ja auch wieder andere auf:
Delphi-Quellcode:
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;
Funktion Irgendwas1 ruft intern Irgendwas2 auf. Und Irgendwas2 kann widerum auch SetLastError aufrufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz