Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

Re: try - except in Dialogprozedur führt zu Darstellungfehle

  Alt 9. Nov 2003, 12:42
Hallo Niko,
sorry, dass ich erst jetzt antworte, hatte etwas viel um die Ohren...

Nachdem ich das Problem auf
Delphi-Quellcode:
function myDlgProc(hDlg: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM):
  Boolean; stdcall;
begin
  Result:= False;
    try
    finally
    end;
 case uMsg of
   123: p();
 end;
end;
eingrenzen konnte (das Case- und das Try-Statement sind notwendig!), wurde ich doch etwas stutzig und habe mir den produzierten ASM-Code einmal etwas genauer angesehen. Der Rückgabewert wird wie folgt gebildet:
Code:
  mov al, [ebp-$01]
In der Win32-Referenz steht zu DialogProc "[...] the dialog box procedure should return nonzero if it processes the message, and zero if it does not.", während in der Deklaration von einem Datentyp BOOL ausgegangen wird. Dies ist typische C-Manier, bei der die Programmierer tatsächlich fast ausschließlich von Ints ausgehen und die Typen nur geschaffen wurden, um hübsch auszusehen...

Tatsache ist nun, dass Delphi ein Boolean als Byte ansieht (trotzdem wg des ByteAlignment aber 4 Bytes beansprucht) und Deine DlgProc aus sicht des Compilers dann False ist, wenn das LowByte des LowWords von eax null ist (siehe snippet von oben)!

Durch den vorherigen Code (TryFinally, Case,...) ist der Akkumulator aber geändert worden, so dass mindestens eines der anderen Bits von eax gesetzt ist. Das API intepretiert diesen Wert (ungleich null) nun gemäß der Definition "Ungleich null heißt True" (siehe oben).

Wenn Du Den Rückgabewert von DlgProc auf LongBool änderst, geht auch der Compiler von einem bool'schen Wert aus, der 32 Bit breit ist, kompiliert den Rückgabewerte so
Code:
  mov eax, [ebp-$04]
und der Code sollte funktionieren.
gruß, choose
  Mit Zitat antworten Zitat