Delphi-PRAXiS

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;

Nicolai1234 19. Apr 2004 17:57

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:
MeinShortString := shortstring(MeinString);
und in meinem Programm:
Delphi-Quellcode:
MeinString := string(MeinShortString);
So kann ich es doch machen oder?

neolithos 19. Apr 2004 17:58

Re: Problem mit dll und pchar
 
In der Dll:

Delphi-Quellcode:
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;
In Prog z.B.:
Delphi-Quellcode:
  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
Buffer = Dynamischer Speicher

neolithos 19. Apr 2004 18:00

Re: Problem mit dll und pchar
 
Zitat:

Zitat von Nicolai1605
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:
MeinShortString := shortstring(MeinString);
und in meinem Programm:
Delphi-Quellcode:
MeinString := string(MeinShortString);
So kann ich es doch machen oder?

NEIN!

In der Dll:

Delphi-Quellcode:
MeinShortString := MeinString; // Achtung alles was mehr als 255 Zeichen sind, wird abgeschnitten
Deinen Prog.
Delphi-Quellcode:
MeinString := MeinShortString;

Nicolai1234 19. Apr 2004 18:06

Re: Problem mit dll und pchar
 
Also einfach einander zuweisen. Habe ich verstanden!!!
Und diesen Teil muss ich gar nicht weiter verwenden.
Zitat:

Zitat von neolithos
In der Dll:

Delphi-Quellcode:
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;
In Prog z.B.:
Delphi-Quellcode:
  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
Buffer = Dynamischer Speicher


neolithos 19. Apr 2004 18:12

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.

Nicolai1234 19. Apr 2004 18:20

Re: Problem mit dll und pchar
 
Ic habe mich jetzt für shortstring entschieden!
Jetzt habe ich in der dll folgende function:
Delphi-Quellcode:
function rueckgabe(herkunft:shortstring):shortstring;
In der letzten Zeile der function steht:
Delphi-Quellcode:
result := ergebnis; //ergebnis ist ein string (bestehend aus 5 Zeichen)
An dieser Zeile entsteht ein fehler. Warum?

neolithos 19. Apr 2004 18:26

Re: Problem mit dll und pchar
 
Welcher Fehler?

Nicolai1234 19. Apr 2004 18:30

Re: Problem mit dll und pchar
 
Folgende Fehlermeldung tritt dann bei mir auch:

Zitat:

Zitat von Die Fehlermeldung
Zugriffsverletzung bei Adresse 003248C2 in Modul 'MeineDLL.dll'. Schreiben von Adresse 00000002.


neolithos 19. Apr 2004 18:38

Re: Problem mit dll und pchar
 
Bei mir gibt es keine Zugriffsverletzung:


Prog:
Delphi-Quellcode:
function Hallo(tst : ShortString) : ShortString;
  external 'Project2.dll';

procedure TForm1.Button3Click(Sender: TObject);
begin
  ShowMessage(Hallo('Hallo'));
end;
In der Dll:
Delphi-Quellcode:
function Hallo(tst : ShortString) : ShortString; export;
begin
  Result := tst + ' Welt';
end;

exports
  Hallo;

Nicolai1234 19. Apr 2004 18:40

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!

neolithos 19. Apr 2004 18:46

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;

Nicolai1234 19. Apr 2004 18:49

Re: Problem mit dll und pchar
 
Jetzt klappt es!!
Ich hatte das hier
Delphi-Quellcode:
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;
vorher in einer extra unit die ich eingebunden hatte! Jetzt sind die direkt in der Anwendung. Kann es an der eingebundenen Unit liegen?

Muetze1 19. Apr 2004 20:54

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

Motzi 19. Apr 2004 21:07

Re: Problem mit dll und pchar
 
Zum Thema Strings, PChars etc. könnt ihr euch auch mal mein String-Tutorial anschaun.. vielleicht hilft das: www.manuel-poeter.de


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