AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stack überlauf

Ein Thema von EWeiss · begonnen am 6. Aug 2017 · letzter Beitrag vom 7. Aug 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Stack überlauf

  Alt 6. Aug 2017, 22:53
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

Geändert von EWeiss ( 6. Aug 2017 um 23:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Stack überlauf

  Alt 6. Aug 2017, 23:18
Die einfachste Lösung wäre es diesen ganzen wvsprintfW Müll (solche Hacks gehen grundsätzlich immer irgendwann schief) mit einem einfachen Format zu ersetzen
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Stack überlauf

  Alt 6. Aug 2017, 23:22
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
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Stack überlauf

  Alt 6. Aug 2017, 23:29
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe ( 7. Aug 2017 um 10:13 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Stack überlauf

  Alt 6. Aug 2017, 23:30
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
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

Geändert von EWeiss ( 6. Aug 2017 um 23:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Stack überlauf

  Alt 6. Aug 2017, 23:40
Ist jetzt etwas schwierig entfernen oder nicht!
Ja

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 va_list auf C/C++ Seite überhaupt eindeutig definiert ist oder implementierungsabhängig je nach Compiler unterschiedlich umgesetzt wird.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Stack überlauf

  Alt 6. Aug 2017, 23:45
Ist jetzt etwas schwierig entfernen oder nicht!
Ja

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 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

Geändert von EWeiss ( 6. Aug 2017 um 23:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: Stack überlauf

  Alt 6. Aug 2017, 23:54
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Stack überlauf

  Alt 7. Aug 2017, 00:00
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Stack überlauf

  Alt 7. Aug 2017, 12:08
Wollte nur noch sagen.. funktioniert jetzt tadellos.
Habe nur 2 Zeilen ändern müssen.

Danke noch mal an die, die mit geholfen haben.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 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