![]() |
Stack überlauf
Zitat:
Delphi-Quellcode:
hr := m_pD3DDirect3d.CreateDevice(D3DADAPTER_DEFAULT, // always the primary display adapter
D3DDEVTYPE_HAL, 0, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dpp, m_pD3DDevice); if (FAILED(hr)) then ErrStr := ReportError('Cannot create a Direct3d device', hr) // <<<< von hier geht das aus. else result := TRUE;
Delphi-Quellcode:
die gesamte Unit.
function ReportError(pszError: pchar; hrCode: HRESULT): WideString;
var szErr: array [0..MAX_ERROR_TEXT_LEN-1] of char; res: DWORD; begin res := AMGetErrorText(hrCode, @szErr[0], MAX_ERROR_TEXT_LEN); if (res <> 0) then result := CallWvsprintf('%s : COM Error 0x%x, %s', [pszError, hrCode, szErr]) else result := CallWvsprintf('%s : COM Error 0x%x', [pszError, hrCode]); end;
Delphi-Quellcode:
in CallWvsprintf direkt bei begin.
// This unit is made using the code from following URL,
// http://proger.i-forge.net/Calling_printf_from_Delphi/7ES unit sprintf; interface function CallWvsprintf(Format: WideString; const Args: array of const): WideString; implementation uses SysUtils, Windows; type TVAList = array[0..$FFFF] of Pointer; function CallWvsprintf(Format: WideString; const Args: array of const): WideString; var VA: TVAList; StrI, I, Size: Integer; Strings: array[0..High(VA)] of WideString; begin StrI := 0; Size := Length(Format) * 2; for I := 0 to Length(Args) - 1 do with Args[I] do if I >= Length(VA) then raise EConvertError.CreateFmt('Too many format arguments (more than %d).', [Length(VA) - 1]) else case VType of vtInteger: begin VA[I] := Pointer(VInteger); Inc(Size, 20); end; vtPChar, vtAnsiString: begin // Delphi will automatically convert String or PChar // into WideString and vice versa: Strings[StrI] := VPChar + #0; VA[I] := @Strings[StrI][1]; Inc(Size, Length(Strings[StrI]) * 2 - 2 {null-terminator}); Inc(StrI); end; vtPWideChar, vtWideString: begin VA[I] := VPWideChar; Inc(Size, Length(VPWideChar) * 2); end; else raise EConvertError.CreateFmt('Invalid format argument of VType = %d.', [VType]); end; SetLength(Result, Size + Size div 10); {10% extra space} SetLength(Result, wvsprintfW(@Result[1], PWideChar(Format), @VA)); end; end. kann mir jemand einen Tip geben wie ich das beheben kann? Wie man lesen kann ist die Unit nicht von mir und der Entwickler nicht mehr erreichbar. gruss |
AW: Stack überlauf
Die einfachste Lösung wäre es diesen ganzen
Delphi-Quellcode:
Müll (solche Hacks gehen grundsätzlich immer irgendwann schief) mit einem einfachen
wvsprintfW
Delphi-Quellcode:
zu ersetzen :P
Format
|
AW: Stack überlauf
Bin jetzt nicht am pc, aber für was soll die function gut sein? Das kannst Du alles mit format(...) erledigen.
Der Stack error kommt von Der variable VA. und Strings..... reche das mal in bytes um:-D |
AW: Stack überlauf
Die lokalen Variablen
Delphi-Quellcode:
belegen jeweils einen Bereich von 65536 * Sizeof(Pointer) auf dem Stack. Das sind 262.144 Byte und entspricht somit ca. 1/4 der maximalen Standard-Stackgröße (eventuell ist die in deiner Anwendung sogar kleiner). Beide Variablen zusammen belegen also ca. 1/2 Megabyte.
type
TVAList = array[0..$FFFF] of Pointer; ... VA: TVAList; Strings: array[0..High(VA)] of WideString; Mach aus beiden dynamische Arrays - die werden auf dem Heap anstatt auf dem Stack angelegt. |
AW: Stack überlauf
Zitat:
Und nochmal Entschuldigung ich bin kein PROFI der so etwas direkt überblicken kann. Also ihr seit der Meinung das ich diese Unit entfernen soll und auf einfaches Format umstellen soll. Wenn dem so ist werde ich versuchen das so umzusetzen. Zitat:
Ist jetzt etwas schwierig entfernen oder nicht! Danke gruss |
AW: Stack überlauf
Zitat:
Keine Ahnung, warum der originale Autor so einen Umstand für das Formatieren der Error Strings betrieben hat, aber solche Sachen fliegen einem immer irgendwann um die Ohren. Bin nichtmal sicher, ob die
Delphi-Quellcode:
auf C/C++ Seite überhaupt eindeutig definiert ist oder implementierungsabhängig je nach Compiler unterschiedlich umgesetzt wird.
va_list
|
AW: Stack überlauf
Zitat:
Danke. Zitat:
gruss |
AW: Stack überlauf
Zitat:
|
AW: Stack überlauf
Zitat:
gruss |
AW: Stack überlauf
Wollte nur noch sagen.. funktioniert jetzt tadellos.
Habe nur 2 Zeilen ändern müssen. Danke noch mal an die, die mit geholfen haben. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 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