Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Probleme mit Datentypen bei einer DLL (https://www.delphipraxis.net/168978-probleme-mit-datentypen-bei-einer-dll.html)

mcinternet 21. Jun 2012 11:24

Probleme mit Datentypen bei einer DLL
 
Moin,

ich habe eine DLL die mir laut Buch eine Adresse auf einen Null-Termierten String zurückgibt
( returns the address of a null-terminated character string ). Habe da bereits alle möglichen Datentypen ausprobiert und komme auf keinen grünen Zweig. Vielleicht hat hier jemand einen Tip?

Die dll ist aus dem Jahre 2004 und wird seitdem nicht mehr verändert -

ich arbeite hier mit Delphi XE unter Windows 7.

der Aufruf ist:

function xyzErrMsg ( errorCode : Word
) : String; stdcall; external xyzdll name 'ErrMsg';

Der Datentyp String passt hier leider nicht

Gruss

McInternet

p80286 21. Jun 2012 11:39

AW: Probleme mit Datentypen bei einer DLL
 
Hast Du es mal mit
Delphi-Quellcode:
PAnsiChar
versucht ?

Gruß
K-H

mcinternet 21. Jun 2012 12:04

AW: Probleme mit Datentypen bei einer DLL
 
Zitat:

Zitat von p80286 (Beitrag 1171906)
Hast Du es mal mit
Delphi-Quellcode:
PAnsiChar
versucht ?

Gruß
K-H

aufruf dann:

var Meldung : PAnsichar;

Meldung := yxzErrMsg(errornummer);

Gruss
McInternet

mcinternet 21. Jun 2012 12:35

AW: Probleme mit Datentypen bei einer DLL
 
ne - kommt nur Blödsinn :(


Gruss

McInternet

NickelM 21. Jun 2012 12:39

AW: Probleme mit Datentypen bei einer DLL
 
Nein, ich glaube du hast ihn falsch verstanden, du musst sozusagen, wie du die Funktion importierst ändern.
Delphi-Quellcode:
function xyzErrMsg ( errorCode : Word
) : String; stdcall; external xyzdll name 'ErrMsg';
zu:
Delphi-Quellcode:
function xyzErrMsg ( errorCode : Word
) : PAnsiChar; stdcall; external xyzdll name 'ErrMsg'; //Man verwendet ungern Strings, also den DatenTyp String von Delphi. PAnsiChar ist nur eine Adresse auf den Anfang eines Textes im Speicher.
Und um im Speicher zu wissen, wann er aufhört, setzt man ein 0 Byte (#0 in Char) am Ende.
D.h. wenn du auf den Datentyp PAnsiChar zugreifst, wird alles gelesen bis zum 0 Byte.
Gruß NickelM

mcinternet 21. Jun 2012 12:43

AW: Probleme mit Datentypen bei einer DLL
 
Zitat:

Zitat von NickelM (Beitrag 1171917)
Nein, ich glaube du hast ihn falsch verstanden, du musst sozusagen, wie du die Funktion importierst ändern.
Delphi-Quellcode:
function xyzErrMsg ( errorCode : Word
) : String; stdcall; external xyzdll name 'ErrMsg';
zu:
Delphi-Quellcode:
function xyzErrMsg ( errorCode : Word
) : PAnsiChar; stdcall; external xyzdll name 'ErrMsg'; //Man verwendet ungern Strings, also den DatenTyp String von Delphi. PAnsiChar ist nur eine Adresse auf den Anfang eines Textes im Speicher.
Und um im Speicher zu wissen, wann er aufhört, setzt man ein 0 Byte (#0 in Char) am Ende.
D.h. wenn du auf den Datentyp PAnsiChar zugreifst, wird alles gelesen bis zum 0 Byte.
Gruß NickelM

das hab ich schon so nach PAnsiChar geändert.

Ich rufe dann diese Funktion so auf:

var Meldung : PAnsiChar;
Fehlernummer : Word;
Begin
Meldung := xyzErrMsg(Fehlernummer);
...
...
end;

nur leider steht da nur Blödsinn drin ( wenn ich schon mit dem Debugger reinschaue)
=> $495ABA{"} ....
und drin stehen muß z.B. => success etc.

Achso: Das Gleiche compiliert unter Delphi 2007 - einwandfrei!

Gruß
McInternet

DeddyH 21. Jun 2012 12:50

AW: Probleme mit Datentypen bei einer DLL
 
Der Funktionskopf ist schon ungewöhnlich für eine Funktion in einer DLL. Normalerweise übergibt man einen Speicherbereich, den man selbst reserviert hat, welcher dann durch die Funktion befüllt wird. Ist die DLL in Delphi geschrieben? Falls in C/C++, hast Du da Header-Dateien dafür? Wie sähe dann da der Originalaufruf aus?

mcinternet 21. Jun 2012 12:57

AW: Probleme mit Datentypen bei einer DLL
 
Zitat:

Zitat von DeddyH (Beitrag 1171921)
Der Funktionskopf ist schon ungewöhnlich für eine Funktion in einer DLL. Normalerweise übergibt man einen Speicherbereich, den man selbst reserviert hat, welcher dann durch die Funktion befüllt wird. Ist die DLL in Delphi geschrieben? Falls in C/C++, hast Du da Header-Dateien dafür? Wie sähe dann da der Originalaufruf aus?

Die DLL ist in C geschrieben - welche Version, keine Ahnung. Kommt von Intel und dient der Kommunikation mit einer TK-Anlage. Es gibt keine neuere Version, auch keine grossartige weitergehende Doku. Zum Coden für eine Komponente mit D2007 war es wohl auch ausreichend. Es gibt dafür auch keinen weitergehenden Support. Leider :shock:

Headerdateien gibt es auch keine :evil:

Gruß

McInternet

Bernhard Geyer 21. Jun 2012 13:12

AW: Probleme mit Datentypen bei einer DLL
 
Zitat:

Zitat von mcinternet (Beitrag 1171922)
Die DLL ist in C geschrieben - welche Version, keine Ahnung. Kommt von Intel und dient der Kommunikation mit einer TK-Anlage. Es gibt keine neuere Version, auch keine grossartige weitergehende Doku.

...

Headerdateien gibt es auch keine :evil:

Kann ich mir nicht vorstellen?
Wie heißt das Produkt? Kann man sich diese DLL/API-Beschreibung noch von Intel herunter laden?

shmia 21. Jun 2012 13:12

AW: Probleme mit Datentypen bei einer DLL
 
Zitat:

Zitat von DeddyH (Beitrag 1171921)
Normalerweise übergibt man einen Speicherbereich, den man selbst reserviert hat,...

In dem konkreten Fall wäre die Art der Datenübergabe aber schon plausibel.
Es gibt ja offensichtlich mehrere Fehlermeldungen, die über einen errorCode ausgewählt werden.
Die Strings liegen in dem Fall hartcodiert im Speicherbereich der DLL und der Aufrufer bekommt lediglich einen Zeiger zurück.
Delphi-Quellcode:
function xyzErrMsg(errorCode : Word): PAnsiChar; stdcall; external xyzdll name 'ErrMsg';

var
  Meldung : AnsiString; // nicht PAnsiChar !
  Fehlernummer : Word;
Begin
  Fehlernummer := 42; // nicht vergessen die Fehlernummer zu setzen!!!
  Meldung := xyzErrMsg(Fehlernummer); // Zeiger auf 0-terminierten String wird automatisch in einen Delphi-String umgewandelt. (Compiler Magic)
  ShowMessage(Meldung);


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
Seite 1 von 2  1 2      

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