Moin,
es geht um folgenden Code:
Delphi-Quellcode:
ZeroMemory(@wcex,sizeof(wcex));
with wcex
do
begin
cbSize := SizeOf(wcex);
style := CS_HREDRAW
or CS_VREDRAW
or CS_OWNDC;
lpfnWndProc := @wndproc;
hInstance := SysInit.HInstance;
hCursor := LoadCursor(0,IDC_ARROW);
lpszClassName := PChar(settings.sWindowClassName);
hbrBackground := 1;
end;
if RegisterClassEx(wcex) = 0
then
raise EREGISTERCLASSEX.create(
{$IFDEF DEBUG}'
RegisterClassEx(wcex) failed '+inttostr(getlasterror)+'
(GLE)'
{$ENDIF});
case settings.rResolution.rScreenMode
of // = smWINDOWEDREGULAR
smFSCRN:
;
smWINDOWEDREGULAR:
begin
dwExStyle:=WS_EX_APPWINDOW
or WS_EX_WINDOWEDGE;
dwStyle:=WS_OVERLAPPEDWINDOW
or WS_CLIPSIBLINGS
or WS_CLIPCHILDREN;
AdjustWindowRectEx(WindowRect,dwStyle,false,dwExStyle);
end;
smWINDOWEDNOBORDER:
;
smFSCRNWINDOWED:
;
end;
asm
int 3
// bis hierhin komme ich
end;
// mit F7 springt er dann weiter in die winapi.pas
_hWnd:=CreateWindowEx(dwExStyle,
PChar(settings.sWindowClassName),
PChar(settings.sWindowCaption),
dwStyle,
WindowRect.Left,
WindowRect.Top,
WindowRect.Width,
WindowRect.Bottom,
0,0,HInstance,
nil);
// bis hierhin kommt er nicht mehr, im debuglog von XE2 steht ein fehler siehe unten
if _hWnd = 0
then
raise ECREATEWND.create(
{$IFDEF DEBUG}'
CreateWindowEx failed '+inttostr(getlasterror)+'
(GLE)'
{$ENDIF});
ShowWindow(_hWnd, SW_SHOW);
SetForegroundWindow(_hWnd);
asm
int 3
end;
Der Debug Output:
Code:
Non-user Breakpoint at $0048B82D. // der int3 breakpoint vor createwindowex
STATUS_STACK_BUFFER_OVERRUN encountered
Process dx11test.exe (1456)
Non-user Breakpoint at $7546FF9A.
Die addresse vom letzten Breakpoint zeigt er mir auch im debugger an:
7546FF9A C745FCFEFFFFFF mov [ebp-$04],$fffffffe
Das ganze ist in einem try..except block, aber bis zum except kommt er auch nicht.
Wenn ich es schaffe mit F7 nicht automatisch im CPU-Viewer zu landen (scheint glückssache zu sein ob der CPUviewer aufgeht oder nicht) dann hängt sich mein DelphiXE2 bei meiner WndProc funktion auf, bis die er steppt nachdem er aus der
winapi.pas raus kommt. Die WndProc funktion sieht so aus:
Delphi-Quellcode:
implementation
var
myclassinstance: TMyClass;
function WndProc(i_hWnd:HWND;i_Message:LongWord;i_wParam:WPARAM;i_lParam:LPARAM):LResult;
begin
result := myclassintance.WndProcEx(i_hWnd, i_Message, i_wParam, i_lParam);
end;
function TMyClass.WndProcEx(i_hWnd:HWND;i_Message:LongWord;i_wParam:WPARAM;i_lParam:LPARAM):LResult;
begin
result := DefWindowProc(i_hWnd, i_Message, i_wParam, i_lParam);
end;
Selbes Resultat wenn ich die funktionen einfach leer lasse.
Jetzt das interessante: wenn ich als 64Bit kompiliere geht es einwandfrei ohne jegliche Änderung oder irgendwelchen {$IFDEF WIN64}'s (die int 3's mal außen vor).
Ich bin völlig ratlos.