Zitat von
Jelly:
Hast Du sowohl in deiner
DLL als auch in deinem Programm jeweils die
Unit ShareMem eingebunden. Die
Unit muss als allererste eingebunden werden.
Nein ist weder in
dll noch in irgendeiner der Anwendungen angegeben.
Ich dachte eigentlich das man ShareMem nicht braucht wenn man mit PChars arbeitet.
Sollte ich jetzt ShareMem in der
dll hinzufügen,
bringt das irgendwelche Nachteile mit sich und könnten auch Anwendungen die kein ShareMem eingebunden haben die
dll noch nutzen?
Und was ist mit anwendungen die in anderen Programmiersprachen geschrieben sind?
Zitat von
Jürgen Thomas:
Sind GetSkinDirectory und GetSkinName Strings oder PChar?
Delphi nimmt die Umwandlung bei den Zuweisungen zwar oft automatisch vor; aber sicherer ist ggf.:
Delphi-Quellcode:
// nur gültig, wenn GetSkinDirectory und GetSkinName jeweils PChar liefern
SkinDir := StrPas(GetSkinDirectory);
SkinName := StrPas(GetSkinName);
Hoffentlich hilft's! Jürgen
Alle funktionen geben PChar zurück.
Die zusätzliche 0 tritt im normalfall auch nur am Ende auf und nicht mittendrin.
Zitat von
SirThornberry:
dir fehlt glaub ich das Verständnis was PChar ist.
PChar ist nichts anderes als ein Pointer der auf eine Reihe von zeischen zeigt welche in der Regel mit #0 terminiert wird.
Mit
result := PChar(stemp);
gibst du also einen Pointer auf die Zeischen von "sTemp" zurück.
Allerdings ist nach verlassen deiner Funktion sTemp gar nicht mehr verfügbar da es eine lokale Variable ist welche auf dem Stack abgelegt werden. Nach verlassen deiner Funktion ist sTemp also nicht mehr gültig. Deine Funktion funktioniert allerdings ab und zu weil zu dem Zeitpunkt vermutlich auf dem Stack noch nix neues liegt. Sobald aber was neues auf dem Stack liegt überschreibt dies den Wert der früher auf dem Stack lagt wo dein Pointer drauf zeigt.
Wäre der ganze String in der Anwendung total verstümmelt und falsch würde ich dem ja zustimmen, die sache ist aber das nur am Ende eine 0 übrig bleibt und der spaß in 99,9% aller fälle funktioniert.
Was passiert denn wenn ich in der Anwendunge eine globale/lokale String variable habe und den rückgabewert darauf zuweise? Da wird sicherlich nicht nur einfach der pointer auf die
dll Daten kopiert sondern der Inhalt in die neue lokale/globale String variable kopiert. Oder?