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:
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
und der Code sollte funktionieren.