Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 02.11.10 11:29 
Ich benutze eine DLL, die als Config einen PAnsiChar nimmt.
Aufruf sieht so aus:
ausblenden Delphi-Quelltext
1:
RTMP_SetupURL(r,PAnsiChar(AnsiString(s)));					

in der DLL wird dieser String durchsucht und in AVal Werten gespeichert (also Länge und Pointer auf anfang, der in dem Fall in der Mitte meines Strings liegt)
z.B. so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
AVal x;
void foo(char *bar){
x.av_val=bar+20;
x.av_len=10;
}


Jetzt habe ich aber Bedenken, was die Gültigkeit des PChars angeht. dürfte der nicht sofort nach dem Aufruf ungültig sein und u.U. mit anderen Daten überschrieben werden können, was dazu führt, dass sich die config ändert, obwohl schon gelesen? Es wird ja nicht der String kopiert sondern nur der Pointer auf einen Teil gespeichert.

Wer kann das klären?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.11.10 12:14 
Normalerweise sollte das durch UniqueString automatisch korrigiert werden sobald der String nach dem Cast auf PChar wieder verändert wird. Da bin ich mir in diesem Fall aber durch die Casts (die wiederum Compilermagic zur Folge haben) nicht so sicher.

Damit die Freigabe korrekt funktioniert, ist es denke ich am besten, wenn du in der DLL den Inhalt kopierst statt nur eine Referenz zu halten.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 02.11.10 14:45 
Nja geht mir halt darum:
AnsiString() wird neuen Speicher reservieren und dann den Unicode-String in Ansi umwandeln. PAnsiChar dann 0-Terminierung prüfen und den Ptr auf das 1. Zeichen zurückgeben.
Nach dem Funktionsaufruf ist die "temporäre" Variable von AnsiString() out-of-scope und der Speicher sollte freigegeben werden (wo sonst?)
Wenn der String dann verändert wird, hat das nix mit UniqueString zu tun, da ja der Speicher an sich freigegeben wurde und da z.b. ein Integer rein könnte...
Die DLL kommt nicht vom mir. Ist die libRTMP.dll. Hab zwar Zugriff auf den Source-Code, aber so kann das ja nicht gedacht sein, oder?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 04.11.10 19:46 
Grundregel beim Schreiben von C-Source: In Funktionen Parameter IMMER selbst kopieren (insbesondere Strings), außer die Funktion gibt selbst an, dass der String verändert wird, was heißt, dass man AUF dem übergebenen Puffer arbeitet.

Für deinen Fall hieße das also: PChar in der DLL kopieren.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 04.11.10 20:36 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Für deinen Fall hieße das also: PChar in der DLL kopieren.
Da das eine Fremd-DLL ist, bleiben zwei Möglichkeiten:
Entweder diese korrigieren und selbst kompilieren (so mache ich es in der Regel), oder als Workaround an die DLL einen direkt dafür gespeicherten String als Pointer übergeben, der danach während die DLL damit arbeitet nicht geändert wird.