![]() |
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:
Dabei passiert aber scheinbar ein Fehler, denn er verändert den string dann. So wird z.B. '[...]Machina.'
MeinString := string(MeinPChar);
zu '[...]Machi@' oder '[...]Machin$' ([...] steht für einen anderen Text!) Weiß einer, wie diese veränderung der letzten 2-3 Zeichen passieren kann? |
Re: Problem mit dll und pchar
Warum geht nicht
MeinString := MeinPChar; |
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:
Wenn immernoch nicht, dann müsste man sich die Erzeugung des PChars in der DLL vornehmen und verändern.
MeinString := string(StrNew(MeinPChar));
MfG Muetze1 |
Re: Problem mit dll und pchar
Jetzt ich verstehe was du willst.
Einfaches Bsp: In der Dll:
Delphi-Quellcode:
In Prog z.B.:
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;
Delphi-Quellcode:
SetLength(sStr, 1024);
SetLength(sStr, GetDataName(PChar(sStr), 1024)); |
Re: Problem mit dll und pchar
In der dll erstelle ich den pchar mit:
Delphi-Quellcode:
Kann ich das auch anders machen?
MeinPChar := pchar(MeinString);
@neolithos Wie muss ich dein Beispiel verstehen? :wiejetzt: |
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). |
Re: Problem mit dll und pchar
Wie kann ich dein Beipiel jetzt in meiner dll einbauen?
|
Re: Problem mit dll und pchar
Zitat:
|
Re: Problem mit dll und pchar
Wie kann ich das jetzt ändern?
Dein Beipsiel von oben vertehe ich nämlich nicht!!! |
Re: Problem mit dll und pchar
Zitat:
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 15:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz