![]() |
CreateWindowEx stack overrun?
Moin,
es geht um folgenden Code:
Delphi-Quellcode:
Der Debug Output:
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;
Code:
Die addresse vom letzten Breakpoint zeigt er mir auch im debugger an:
Non-user Breakpoint at $0048B82D. // der int3 breakpoint vor createwindowex
STATUS_STACK_BUFFER_OVERRUN encountered Process dx11test.exe (1456) Non-user Breakpoint at $7546FF9A. 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:
Selbes Resultat wenn ich die funktionen einfach leer lasse.
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; 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. |
AW: CreateWindowEx stack overrun?
Blicke durch deinen Code nicht durch..
Aber die Meldung sagt ja schon das ein Stack Überlauf aufgetreten ist. Also ruft sich irgend etwas bei deiner Window erstellung immer wieder selbst auf. So das du in einer Endlosschleife hängst. Aber die Namensgebung ist sowas außerhalb der norm das ich mich in deinem Code nicht wirklich zurechtfinde .. Zu Anstrengend das zu lesen. gruss |
AW: CreateWindowEx stack overrun?
mal den code abgespeckt (und createwindowex durch createwindow ersetzt)
Delphi-Quellcode:
gleicher Fehler, und trotzdem funktionierts einwandfrei als 64bit version.
unit CoreWndObj;
interface uses System.SysUtils, System.Classes, system.Types, Winapi.Windows, Winapi.Messages; type TCoreWnd = class(TObject) private myhWnd: HWND; public constructor create(); end; implementation function WndProc(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; constructor TCoreWnd.create(); var wcex: TWndClassEx; dwStyle: dword; x,y: string; begin inherited create; x := 'blablub'; y := 'blblbl'; 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(x); hbrBackground := 1; end; if RegisterClassEx(wcex) = 0 then writeln('error'); dwStyle := WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN; myhWnd := CreateWindow( PChar(x), PChar(y), dwStyle, 120, 120, 1280, 768, 0,0,SysInit.HInstance,nil); if myhWnd = 0 then Writeln('error'); ShowWindow(myhWnd, SW_SHOW); SetForegroundWindow(myhWnd); end; end. |
AW: CreateWindowEx stack overrun?
Ich hab da etwas gefunden, was vielleicht weiterhilft:
![]() Vor allem den Hinweis auf den int3 fand ich interessant, könnte aber sein, daß ich vollkommen falsch liege. Gruß K-H |
AW: CreateWindowEx stack overrun?
Was hat denn die Analyse angreifbarer Abstürze mit meinem stack buffer overrun zu tun?
Also die Windowsapi scheint von außerhalb der Delphiunits unendlich oft WndProc zu callen, wenn ich da mit dem debugger reinsteppe hängt sich allerdings wie gesagt mein XE2 auf (100% cpu auslastung im debugger thread). Warum er das nun als 64Bit Version nicht macht ist mir genauso ein Rätsel. :stupid: Edit: eigentlich erster Schritt bei solchen Fehlern, aber ich hab grade das ganze mal in einem neuen projekt ausprobiert, gleicher Fehler. |
AW: CreateWindowEx stack overrun?
Ok. Erschlag mich wer.
stdcall bei der wndproc vergessen. |
AW: CreateWindowEx stack overrun?
Zitat:
Du solltest eher mich erschlagen hätte das eigentlich sehen müssen ;) Aber wie gesagt die ganzen i_ vor jeden Namen vielleicht hat das mich abgelenkt. Aber jeder wie er will. gruss |
AW: CreateWindowEx stack overrun?
Unter Win64 wurde auch so Einiges an den Aufrufkonventionen geändert.
|
AW: CreateWindowEx stack overrun?
Zitat:
|
AW: CreateWindowEx stack overrun?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz