AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit dll und pchar

Ein Thema von Nicolai1234 · begonnen am 19. Apr 2004 · letzter Beitrag vom 19. Apr 2004
Antwort Antwort
Seite 1 von 3  1 23      
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem mit dll und pchar

  Alt 19. Apr 2004, 14:06
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:
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?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 15:51
Warum geht nicht

MeinString := MeinPChar;
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 16:54
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:

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
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 17:43
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));
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 17:45
In der dll erstelle ich den pchar mit:
MeinPChar := pchar(MeinString); Kann ich das auch anders machen?

@neolithos
Wie muss ich dein Beispiel verstehen?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#6

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 17:46
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).
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 17:47
Wie kann ich dein Beipiel jetzt in meiner dll einbauen?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 17:48
Zitat von Nicolai1605:
In der dll erstelle ich den pchar mit:
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 17:50
Wie kann ich das jetzt ändern?

Dein Beipsiel von oben vertehe ich nämlich nicht!!!
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#10

Re: Problem mit dll und pchar

  Alt 19. Apr 2004, 17:53
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;
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 Uhr.
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