Wolfgang
2020-04-09 07:45:20 UTC
Liebe Delphigemeinde!
Ich sehe scheinbar den Wald vor lauter Bäumen nicht mehr.
Ihr könnt mir da sicher weiterhelfen.
In einem kleinen (~1000 Zeilen) Testprogramm funktioniert das,
in einem großen Projekt stürzt das Programm so heftig, dass
nicht einmal der try except Block greift. Vermute mal dass
die StringList Rueck nicht genug Platz hat um die ~10KB
aus p_Rueck auszunehmen. Wie bekomme ich die Daten auf die
p_Rueck zeigt in die Stringlist kopiert.
Ich danke Euch!
Das ist das relevante Codeschnippsel:
private
...
BufferLen : Integer; // wird mit 40 * 1024 initialisiert
Counter : Integer;
p_Rueck : PChar;
...
Procedure Holen;
var ...
Rueck : TStrings;
...
begin
...
Counter := 0;
// Dient nur dazu wenn der Buffer zu klein ist mit einem
// groesseren Buffer weiter zu machen
repeat
inc(Counter);
p_Rueck := nil;
p_Rueck := StrAlloc((Counter * BufferLen) + 1);
// ShowMessage(IntToStr(StrBufSize(p_Rueck))); // Wert ok
// Antwort aus einer DLL
errno := GetAnswer(HDL,p_Rueck, StrBufSize(p_Rueck) );
if (errno = BUFFERTOSMALL) then
StrDispose(p_Rueck);
Sleep(500);
until (Counter > 3) or (errno <> BUFFERTOSMALL);
if errno = SUCCESS then
begin
Rueck := TStringList.Create;
//StrLCopy(PChar(Rueckm.Text),p_rm,StrLen(p_rm)-1); // strlen ok
//Rueck.Text := String(p_Rueck);
Rueck.Text := StrPas(p_Rueck); // Absturz
StrDispose(p_Rueck);
Rueck.Free;
end;
...
end;
mfg Wolfgang
Ich sehe scheinbar den Wald vor lauter Bäumen nicht mehr.
Ihr könnt mir da sicher weiterhelfen.
In einem kleinen (~1000 Zeilen) Testprogramm funktioniert das,
in einem großen Projekt stürzt das Programm so heftig, dass
nicht einmal der try except Block greift. Vermute mal dass
die StringList Rueck nicht genug Platz hat um die ~10KB
aus p_Rueck auszunehmen. Wie bekomme ich die Daten auf die
p_Rueck zeigt in die Stringlist kopiert.
Ich danke Euch!
Das ist das relevante Codeschnippsel:
private
...
BufferLen : Integer; // wird mit 40 * 1024 initialisiert
Counter : Integer;
p_Rueck : PChar;
...
Procedure Holen;
var ...
Rueck : TStrings;
...
begin
...
Counter := 0;
// Dient nur dazu wenn der Buffer zu klein ist mit einem
// groesseren Buffer weiter zu machen
repeat
inc(Counter);
p_Rueck := nil;
p_Rueck := StrAlloc((Counter * BufferLen) + 1);
// ShowMessage(IntToStr(StrBufSize(p_Rueck))); // Wert ok
// Antwort aus einer DLL
errno := GetAnswer(HDL,p_Rueck, StrBufSize(p_Rueck) );
if (errno = BUFFERTOSMALL) then
StrDispose(p_Rueck);
Sleep(500);
until (Counter > 3) or (errno <> BUFFERTOSMALL);
if errno = SUCCESS then
begin
Rueck := TStringList.Create;
//StrLCopy(PChar(Rueckm.Text),p_rm,StrLen(p_rm)-1); // strlen ok
//Rueck.Text := String(p_Rueck);
Rueck.Text := StrPas(p_Rueck); // Absturz
StrDispose(p_Rueck);
Rueck.Free;
end;
...
end;
mfg Wolfgang