hmmm, vielleicht legt da Delphi ja mehrere TempStrings an ... die Code-Optimierung ist schon schlimm/verworren -.-°
hier mal ein einfaches Beispiel, welches "NICHT" funktionieren könnte
Delphi-Quellcode:
// 'ne Form1 mit 2 TEdit's
Function Test(S: WideString): PAnsiChar;
Begin
Result := PAnsiChar(AnsiString(S));
End;
Procedure TForm1.FormCreate(Sender: TObject);
Var P: PAnsiChar;
i: Integer;
A: Array[0..1000] of String;
Begin
P := Test('123456789');
Edit1.Text := P;
P := Test('123456789');
For i := Low(A) to High(A) do
A[i] := StringOfChar(AnsiChar(#65), 10);
Edit2.Text := P;
End;
[add]
nutzt du kein FastMM oder ShareMem für deine
DLL?
nja, dann hast du Glück, daß deine
DLL einen eigenen Speichermanager nutzt
und dieser gerade den genutzten Speicherblock zufällig nicht freigibt.
[add2]
eventuell geht es so "NICHT" besser *hust*
Delphi-Quellcode:
function BASS_AIMP2VIS_GetName(
handle: HVIS): PAnsiChar;
stdcall;
var
PluginInfo: PWideChar;
i: Integer;
A:
Array of AnsiString;
begin
SetLength(A, 1000000);
for i := 0
to High(A)
do
A[i] := StringOfChar(AnsiChar(#65), 18);
Result :=
nil;
if (
not A_ValidHandle(
handle))
then
begin
BassFuncs^.SetError(BASS_ERROR_HANDLE);
Exit;
end;
VisInfo := PAIMPVisInfo(
Handle);
BassFuncs^.SetError(BASS_OK);
PluginInfo := VisInfo^.VisPointer.PluginInfo;
Result := PAnsiChar(AnsiString(PluginInfo));
if A[20] = '
'
then ;
end;