AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi auftretende Error bei nonVCL Fenster
Thema durchsuchen
Ansicht
Themen-Optionen

auftretende Error bei nonVCL Fenster

Ein Thema von Cyf · begonnen am 20. Jul 2008 · letzter Beitrag vom 20. Jul 2008
Antwort Antwort
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#1

auftretende Error bei nonVCL Fenster

  Alt 20. Jul 2008, 17:51
Ich versuch mich grade mal an ein wenig nonVCL Programmierung, allerdings gibt mir 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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: auftretende Error bei nonVCL Fenster

  Alt 20. Jul 2008, 18:19
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 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);
  // ...;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#3

Re: auftretende Error bei nonVCL Fenster

  Alt 20. Jul 2008, 20:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: auftretende Error bei nonVCL Fenster

  Alt 20. Jul 2008, 22:38
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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