Einen PChar als Ergebnis einer Funktion zurückzugeben (egal ob
DLL oder nicht) ist keine gute Idee. Was denkst du, warum es
keine Windows-
API-Funktion gibt, die so etwas tut? Funktionen, die einen String ermitteln, bekommen normalerweise zwei Parameter: einen PChar von der aufrufenden Funktion und dessen Größe (siehe z.B.
GetWindowsDirectory).
Selbst wenn du eine globale Stringvariable für den Rückgabewert benutzt, so hättest du immer noch das Problem, dass das Ergebnis nur so lange Gültigkeit besitzt, wie du diese Variable nicht änderst. Und ob der Aufrufer ein korrektes Ergebnis erhält hängt einfach nur davon ab, ob der Speicher in der Zwischenzeit schon überschrieben wurde oder nicht (worauf du normalerweise keinen Einfluss hast).
Die einzige wirklich funktionierende Lösung wäre ein festes char-Array:
Delphi-Quellcode:
// Globale Variable mit gleichbleibender Adresse
var
ReturnValue: array [0 .. 255] of char;
function GetCurrentSkinFile : PChar;
var
SkinDir : String;
SkinName : String;
stemp:String;
begin
SkinDir := GetSkinDirectory;
SkinName := GetSkinName;
stemp := SkinDir +
IncludeTrailingBackslash(SkinName) +
'Skin.xml';
StrCopy(@ReturnValue[0], PChar(stemp));
result := @ReturnValue[0];
end;