Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit dll und pchar (https://www.delphipraxis.net/20520-problem-mit-dll-und-pchar.html)

Nicolai1234 19. Apr 2004 14:06


Problem mit dll und pchar
 
Ist zwar ein altes Problem, aber ich formuliere es jetzt mal klar und eindeutig:

Ich habe eine dll, die einen pchar an meine Anwendung übergibt!
Ich denke mit dem PChar wird in dll alles richtig gemacht und es sollten daher keine Probleme auftreten.
Nun möchte ich den pchar in der anwendung in einen string umwandeln, was ich wie folt mache:
Delphi-Quellcode:
MeinString := string(MeinPChar);
Dabei passiert aber scheinbar ein Fehler, denn er verändert den string dann. So wird z.B. '[...]Machina.'
zu '[...]Machi@'
oder '[...]Machin$'
([...] steht für einen anderen Text!)

Weiß einer, wie diese veränderung der letzten 2-3 Zeichen passieren kann?

neolithos 19. Apr 2004 15:51

Re: Problem mit dll und pchar
 
Warum geht nicht

MeinString := MeinPChar;

Muetze1 19. Apr 2004 16:54

Re: Problem mit dll und pchar
 
Moin!

Auch wenn es in den DLLs immer so schön heisst, das mit der Benutzung von PChars die ShareMem wegfällt und es keine Probleme gibt, gibt es sie trotzdem auf grund von Borlands Referenzensystem. Nutze folgenden Code und es sollte klappen:

Delphi-Quellcode:
MeinString := string(StrNew(MeinPChar));
Wenn immernoch nicht, dann müsste man sich die Erzeugung des PChars in der DLL vornehmen und verändern.

MfG
Muetze1

neolithos 19. Apr 2004 17:43

Re: Problem mit dll und pchar
 
Jetzt ich verstehe was du willst.

Einfaches Bsp:

In der Dll:

Delphi-Quellcode:
function GetDataName(pStr : PChar; iStrLen : Integer) : Integer;
var sDataName : String;
begin
  sDataName := 'Hallo Welt!';
  Result := Min(Length(sDataName), iStrLen - 1);
  StrLCopy(pStr, PChar(sDataName), Result);
end;
In Prog z.B.:
Delphi-Quellcode:
  SetLength(sStr, 1024);
  SetLength(sStr, GetDataName(PChar(sStr), 1024));

Nicolai1234 19. Apr 2004 17:45

Re: Problem mit dll und pchar
 
In der dll erstelle ich den pchar mit:
Delphi-Quellcode:
MeinPChar := pchar(MeinString);
Kann ich das auch anders machen?

@neolithos
Wie muss ich dein Beispiel verstehen? :wiejetzt:

neolithos 19. Apr 2004 17:46

Re: Problem mit dll und pchar
 
Dieser Umweg muss gemacht werden, damit sichergestellt wird, das jeder Byte in dem Speicher liegt wo es hingehört.

Dein PChar kommt nämlich aus dem Speicherbereich der Dll und wird ohnehin dadurch das die Procedure beendet wurde nicht mehr existieren (sprich du greifst mit deinem Code womöglich auf eine Speicherleiche zu).

Nicolai1234 19. Apr 2004 17:47

Re: Problem mit dll und pchar
 
Wie kann ich dein Beipiel jetzt in meiner dll einbauen?

neolithos 19. Apr 2004 17:48

Re: Problem mit dll und pchar
 
Zitat:

Zitat von Nicolai1605
In der dll erstelle ich den pchar mit:
Delphi-Quellcode:
MeinPChar := pchar(MeinString);

Du erstellst keinen PChar sondern du zeigst auf den PChar des String's. Da dein String wahrscheinlich Lokal definiert wurde, zeigt, sobald die Procedure beendet wurde, MeinPChar ins nirvana, da der String zu diesem Zeitpunkt abgebaut ist.

Nicolai1234 19. Apr 2004 17:50

Re: Problem mit dll und pchar
 
Wie kann ich das jetzt ändern?

Dein Beipsiel von oben vertehe ich nämlich nicht!!!

neolithos 19. Apr 2004 17:53

Re: Problem mit dll und pchar
 
Zitat:

Zitat von Nicolai1605
Wie kann ich dein Beipiel jetzt in meiner dll einbauen?

Dieses Bsp soll demonstrieren wie man Zeichenketten sauber übergeben kann. Dazu wird der Funktion GetDataName ein Speicherbereich übergeben, in die die Zeichenkette kopiert wird.
Du solltest das jetzt verstehen und auf deinen Anwendungsfall übertragen.

Übrigens: Wird die Dll nur von Delphi-Prog. benutzt und sind die Zeichenketten kleiner 256 Zeichen, dann kannst du auch ShortString verwenden. ShortString läst sich einfacher handhaben, da er über den Stack weitergegeben wird, sprich Delphi kümmert sich um den Speicher.

Delphi-Quellcode:
function GetDataName : ShortString;
begin
  Result := 'Hallo Welt!';
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 Uhr.
Seite 1 von 3  1 23      

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