Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi PChar to String & zurück - Zeichen geht verloren (https://www.delphipraxis.net/101505-pchar-string-zurueck-zeichen-geht-verloren.html)

brechi 15. Okt 2007 15:24

Re: PChar to String & zurück - Zeichen geht verloren
 
@ThE_-_BliZZarD:
Ich hoffe du beachtest die Einwände von Thomas und mir. Du hast vielleicht dein Problem kurzzeitig für deinen Beispielparameter gelöst. Die Lösung mit dem #0 ist einfach nur gefrickel und absolut unsicher. Wunder dich nicht wenn dein programm irgendwann mal einfach crashed.

Benutze einen String als Rückgabewert. Das geht auch in dlls, dafür musst du dann aber als erste unit sharemem benutzen. Ansonsten kann das selbe Verhalten auftreten (manchmal gehts und manchmal nicht).

Oder du benutzt den WinAPI Ansatz wenn du unbedingt einen PChar benutzen willst. Alles andere ist programmiertechnisch unsauber und nicht zu empfehlen. Auch wenn es nun den Anschein hat es funktioniert.

Ich hoffe für alle die mal das selbe Problem haben, dass sie diesen Thread bis zum Ende lesen.

ThE_-_BliZZarD 16. Okt 2007 19:45

Re: PChar to String & zurück - Zeichen geht verloren
 
Ich muss mich dem anschließen, es funktioniert nicht mehr. Also bis zurück in das Mutterprog hats mein Wert geschafft, aber dann ist Ende..^^

Ich hatte irgendwo schon ein Sourcebeispiel für eine Implementation ala GetModuleFileName() gesehn, leider finde ich sie nicht mehr :roll:
Hoffe ihr könnt mir nochmal verzeihen und ein gaaanz kurzes Stück Beispielcode machen :-/ Denn, ich habe leider bisher noch nie selber Speicher angefordert/beschrieben geschweige denn wieder freigegeben..

Thx in advance,

BliZZarD

Dax 16. Okt 2007 19:56

Re: PChar to String & zurück - Zeichen geht verloren
 
Delphi-Quellcode:
function PCharDLLFunktion(str: PChar): Integer;
var s: String;
begin
  s := StringDLLFunktion;
  if str = nil then
    Result := Length(s)
  else
  begin
    try
      Move(s[1], str^, Length(s));
      Result := -1; //Success
    except
      Result := -2; //Failure
    end;
  end;
end;


function NichtDLLFunktion: String;
begin
  SetLength(Result, PCharDLLFunktion(nil));
  if PCharDLLFunktion(@Result[1]) <> -1 then
    MessageBox('Fehler');
end;

// Oder so ähnlich

ThE_-_BliZZarD 16. Okt 2007 20:11

Re: PChar to String & zurück - Zeichen geht verloren
 
hmm.. warum wurde dort jetzt nichts mit Speicher allozieren/freigeben usw gemacht?
Oder reicht das für meine Zwecke schon.

(man ist mir die Frage peinlich...)



Allllllerdings, ich glaube das Problem behebt sich selbsttätig.

Ich muss einer anderen Funktion in der DLL einen Record übergeben, der jede Menge kram enthält, und der soll in der DLL-Funktion geändert/erweitern werden und dann wieder zum Mutterprogramm zurückgegeben werden.. Dafür brauch ich ShareMem, oder?

Und wenn ja.. dann kann ich ja auch gleich Strings verwenden, ne?

Muss ich irgendwas beachten wenn ich ShareMem einsetze?
Dazu 2 Fragen:
1. Wie kann ich sicherstellen, das die für ShareMem benötigten Bibliotheken (welche DLL's sind das?) auch beim Anwender vorhanden sind? Beim Start des Programms aus einer Resource extrahieren hilft ja nicht, da die DLL's ja schon beim Start geladen werden..
2. Wie muss ich den Record übergeben, damit er im Unterprogramm geändert werden kann und diese Werte auch erhalten bleiben? Normal mit
Delphi-Quellcode:
function DLLs_nerven_irgendwie(var MyKnoten: TKnotenFeld): Integer;
?? Oder gibts da irgendwas special-artiges?^^

Danke leute,

BliZZarD

Progman 16. Okt 2007 20:17

Re: PChar to String & zurück - Zeichen geht verloren
 
ShareMem muss als erste Unit in der dpr-Datei stehen, und wenn du die Anwendung weitergibst, musst du die Borlandmm.dll mitgeben.

Whookie 16. Okt 2007 20:19

Re: PChar to String & zurück - Zeichen geht verloren
 
1: Ja über SetLength wird Speicher reserviert, damit funktioniert obiges Beispiel

2: Das hängt ganz von deinem Record ab, denn es keiner Größenveränderung bedarf, dann funktioniert dein Beispiel bereits (mit Var übergibst du im Prinzip einen Pointer auf dein Record).


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz