![]() |
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; |
Re: Problem mit dll und pchar
Meine dll wird nur von meinem Prgramm sprich Delphi verwendet und es sind weniger als 255 Zeichen!
Also mit shortstring wäre das kein Problem? Dann kann ich in der dll schreiben:
Delphi-Quellcode:
und in meinem Programm:
MeinShortString := shortstring(MeinString);
Delphi-Quellcode:
So kann ich es doch machen oder?
MeinString := string(MeinShortString);
|
Re: Problem mit dll und pchar
In der Dll:
Delphi-Quellcode:
In Prog z.B.:
function GetDataName(pStr : PChar; iStrLen : Integer) : Integer;
var sDataName : String; begin sDataName := 'Hallo Welt!'; // Irgentein Text Result := Min(Length(sDataName), iStrLen - 1); // Passt die Zeichenkette in den Speicher ? // wenn nicht kopiere was geht, sonst kopiere Text // + setzen des Rückgabewertes der tatsächlich kopierten Zeichen StrLCopy(pStr, PChar(sDataName), Result); // Sicheres kopieren in den Buffer end;
Delphi-Quellcode:
Buffer = Dynamischer Speicher
SetLength(sStr, 1024); // Erstelle Buffer für 1024 Zeichen
SetLength(sStr, GetDataName( PChar(sStr), // Übergib Buffer 1024) // Sage wieviel Byte der Buffer hat ); // Lösche alle Überflüssigen Bytes, die Hintendranhängen |
Re: Problem mit dll und pchar
Zitat:
In der Dll:
Delphi-Quellcode:
Deinen Prog.
MeinShortString := MeinString; // Achtung alles was mehr als 255 Zeichen sind, wird abgeschnitten
Delphi-Quellcode:
MeinString := MeinShortString;
|
Re: Problem mit dll und pchar
Also einfach einander zuweisen. Habe ich verstanden!!!
Und diesen Teil muss ich gar nicht weiter verwenden. Zitat:
|
Re: Problem mit dll und pchar
Das kompliziertere Bsp gilt für Zeichenketten die mehr als 255 Zeichen enthalten. Hat also auch seine Berechtigung.
Du musst entscheiden was du machen möchtest. |
Re: Problem mit dll und pchar
Ic habe mich jetzt für shortstring entschieden!
Jetzt habe ich in der dll folgende function:
Delphi-Quellcode:
In der letzten Zeile der function steht:
function rueckgabe(herkunft:shortstring):shortstring;
Delphi-Quellcode:
An dieser Zeile entsteht ein fehler. Warum?
result := ergebnis; //ergebnis ist ein string (bestehend aus 5 Zeichen)
|
Re: Problem mit dll und pchar
Welcher Fehler?
|
Re: Problem mit dll und pchar
Folgende Fehlermeldung tritt dann bei mir auch:
Zitat:
|
Re: Problem mit dll und pchar
Bei mir gibt es keine Zugriffsverletzung:
Prog:
Delphi-Quellcode:
In der Dll:
function Hallo(tst : ShortString) : ShortString;
external 'Project2.dll'; procedure TForm1.Button3Click(Sender: TObject); begin ShowMessage(Hallo('Hallo')); end;
Delphi-Quellcode:
function Hallo(tst : ShortString) : ShortString; export;
begin Result := tst + ' Welt'; end; exports Hallo; |
Re: Problem mit dll und pchar
du verwendest ja uch keinen string! Ich habe ja in der dll einen string, den ich dann zu einem shortstring mache und dabei tritt der Fehler auf!
|
Re: Problem mit dll und pchar
Immer noch kein Fehler:
Delphi-Quellcode:
function Hallo(tst : ShortString) : ShortString; export;
var sTmp : String; begin sTmp := tst + ' Welt'; Result := sTmp; end; exports Hallo; |
Re: Problem mit dll und pchar
Jetzt klappt es!!
Ich hatte das hier
Delphi-Quellcode:
vorher in einer extra unit die ich eingebunden hatte! Jetzt sind die direkt in der Anwendung. Kann es an der eingebundenen Unit liegen?
function rueckgabe(herkunft:shortstring):shortstring;
external 'machina.dll'; function machina(quelle:string):string; var s,s2: shortstring; begin s := quelle; s2 := rueckgabe(s); result := s2; end; |
Re: Problem mit dll und pchar
Moin!
Da ShortStrings diese Längeneinschränkung haben kann ich nur dem frühen Posting von ??? zustimmen und dir raten das mit PChar's zu machen, nur halt richtig. ShortStrings sind so oder so ausgestorben... Du musst dir halt nur den PChar ordentlich alloziieren und nicht einfach TypeCasten... Aber es funktioniert ja jetzt... MfG Muetze1 |
Re: Problem mit dll und pchar
Zum Thema Strings, PChars etc. könnt ihr euch auch mal mein String-Tutorial anschaun.. vielleicht hilft das:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 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