Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Stack überlauf (https://www.delphipraxis.net/193496-stack-ueberlauf.html)

EWeiss 6. Aug 2017 21:53


Stack überlauf
 
Zitat:

exception class : EStackOverflow
exception message : Stack-Überlauf.

main thread ($1894):
05e40d12 +012 KVideoPlayer.dll sprintf 23 +0 CallWvsprintf
05e41fb8 +088 KVideoPlayer.dll CommonUtils 131 +5 ReportError
05e428be +17e KVideoPlayer.dll CommonUtils 394 +31 BuildDirect3d
Die Funktion die das verursacht.

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:
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;
die gesamte Unit.
Delphi-Quellcode:
// 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.
in CallWvsprintf direkt bei begin.

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

Zacherl 6. Aug 2017 22:18

AW: Stack überlauf
 
Die einfachste Lösung wäre es diesen ganzen
Delphi-Quellcode:
wvsprintfW
Müll (solche Hacks gehen grundsätzlich immer irgendwann schief) mit einem einfachen
Delphi-Quellcode:
Format
zu ersetzen :P

Fritzew 6. Aug 2017 22:22

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

Uwe Raabe 6. Aug 2017 22:29

AW: Stack überlauf
 
Die lokalen Variablen

Delphi-Quellcode:
type
  TVAList = array[0..$FFFF] of Pointer;
...
VA: TVAList;
Strings: array[0..High(VA)] of WideString;
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.

Mach aus beiden dynamische Arrays - die werden auf dem Heap anstatt auf dem Stack angelegt.

EWeiss 6. Aug 2017 22:30

AW: Stack überlauf
 
Zitat:

Zitat von Fritzew (Beitrag 1378207)
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

Entschuldige bitte wie du siehst und ich es auch sagte ist diese Funktion nicht von mir ;)
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:

Mach aus beiden dynamische Arrays - die werden auf dem Heap anstatt auf dem Stack angelegt.
Ok das wäre auch eine lösung eventuell einfacher als den ganzen Kram von CallWvsprintf zu entfernen.

Ist jetzt etwas schwierig entfernen oder nicht!

Danke

gruss

Zacherl 6. Aug 2017 22:40

AW: Stack überlauf
 
Zitat:

Zitat von EWeiss (Beitrag 1378209)
Ist jetzt etwas schwierig entfernen oder nicht!

Ja :!::-D

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:
va_list
auf C/C++ Seite überhaupt eindeutig definiert ist oder implementierungsabhängig je nach Compiler unterschiedlich umgesetzt wird.

EWeiss 6. Aug 2017 22:45

AW: Stack überlauf
 
Zitat:

Zitat von Zacherl (Beitrag 1378210)
Zitat:

Zitat von EWeiss (Beitrag 1378209)
Ist jetzt etwas schwierig entfernen oder nicht!

Ja :!::-D

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:
va_list
auf C/C++ Seite überhaupt eindeutig definiert ist oder implementierungsabhängig je nach Compiler unterschiedlich umgesetzt wird.

Klare Ansage! (nicht böse gemeint) werde ich dann ändern.
Danke.

Zitat:

Bin nichtmal sicher
Nun zumindest in der IDE sagt man mir das VA nicht definiert wäre obwohl es das eigentlich ist.

gruss

Uwe Raabe 6. Aug 2017 22:54

AW: Stack überlauf
 
Zitat:

Zitat von Zacherl (Beitrag 1378210)
Keine Ahnung, warum der originale Autor so einen Umstand für das Formatieren der Error Strings betrieben hat

Vermutlich weil der Code in Delphi 7 geschrieben wurde und es dort noch kein Format für WideString gab.

EWeiss 6. Aug 2017 23:00

AW: Stack überlauf
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1378212)
Zitat:

Zitat von Zacherl (Beitrag 1378210)
Keine Ahnung, warum der originale Autor so einen Umstand für das Formatieren der Error Strings betrieben hat

Vermutlich weil der Code in Delphi 7 geschrieben wurde und es dort noch kein Format für WideString gab.

Ja Silhwan hat früher hauptsächlich mit D7 gearbeitet. :)

gruss

EWeiss 7. Aug 2017 11:08

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 00:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz