AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Probleme mit Datentypen bei einer DLL
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Datentypen bei einer DLL

Ein Thema von mcinternet · begonnen am 21. Jun 2012 · letzter Beitrag vom 2. Jul 2012
Antwort Antwort
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 12:39
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
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 12:43
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
Jörg

Geändert von mcinternet (21. Jun 2012 um 12:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#3

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 12:50
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 12:57
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

Headerdateien gibt es auch keine

Gruß

McInternet
Jörg
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.222 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 13:12
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
Kann ich mir nicht vorstellen?
Wie heißt das Produkt? Kann man sich diese DLL/API-Beschreibung noch von Intel herunter laden?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 13:12
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);
Andreas

Geändert von shmia (21. Jun 2012 um 13:15 Uhr)
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 13:30
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);
Bei dieser Version bekomme ich immer eine Zahl ( immer die gleiche, egal welchen Code ich übergebe ) zurück => 1180672

Gruss
McInternet
Jörg
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 18:08
Liegt dir nicht der Original export vor?
In dem Buch wird doch sicher irgendwie ein Beispiel oder sonstwas stehen, oder wenn sie von C++ kommt poste mal die Dekleration von dort.
Das Ding ist nämlich, bei PAnsiChar's gibt es 2 Mögliche aufrufe.
- Erstens du übergibst die Variable, wo der Pointer "gespeichert" bzw. hinterlegt wird. Die DLL legt ggf. den Speicher fest und übergibt dir den Pointer (Adresse);
- Du musst einen Speicher festlegen. Dazu müsstest du die Größe wissen, also wie Lang der Text sein wird. Du legst den Speicher fest und übergibst die Variable an die Funktion. Diese schreibt in die Adresse die Daten.

In deinem Fall würd ich auf das erste Tippen. Versuch mal folgendes:
Delphi-Quellcode:
function xyzErrMsg(errorCode : Word): Pointer; stdcall; external xyzdll name 'ErrMsg';
//oder mal das
function xyzErrMsg(errorCode : Word): Pointer; cdecl; external xyzdll name 'ErrMsg';
//oder mal einen von den Beiden
function xyzErrMsg(const errorCode : Word): Pointer; stdcall; external xyzdll name 'ErrMsg';
function xyzErrMsg(const errorCode : Word): Pointer; cdecl; external xyzdll name 'ErrMsg';
//noch eine Möglich aber unwahrscheinlich
function xyzErrMsg(var errorCode : Word): Pointer; stdcall; external xyzdll name 'ErrMsg';
function xyzErrMsg(var errorCode : Word): Pointer; cdecl; external xyzdll name 'ErrMsg';
//Bei allen Möglchkeiten lass das Pointer mal hintendran.

var
  Meldung : PAnsiChar;
  P : Pointer;
  ErrorCode : Word;
Begin
  for ErrorCode := 0 to High(Word) do
  begin
    P := xyzErrMsg(ErrorCode);
    If P <> nil then
    begin
      Meldung := P; //Setz mal hier ein Breakpoint
      ShowMessage(Meldung);
    end;
  end;
So bei irgendeinem Wert muss er ja einen Text zurückgeben. Und alle Imports mal durchgehen mit diesem Code.

EDIT: Sorry, überlesen, hast ja schon gesagt, dass es keine Doku oder sonstwas gibt. Das sie in C geschrieben ist, sollte einer der cdecl; oben vielleicht eher funken.
Vielleicht Funkt dan irgendwas.

Gruß NickelM
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.

Geändert von NickelM (21. Jun 2012 um 18:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#9

AW: Probleme mit Datentypen bei einer DLL

  Alt 21. Jun 2012, 18:27
CONST bringt bei Word nicht viel (ändert garnichts).

"ErrMsg" ... C++ baut gerne auch die Parametersignatur in den Exportnamen ein. Eventuell heißt es ja nicht "ErrMsg". ( ist das eigentlich CaseSensitiv? )

Statt Pointer kann man auch gleich PAnsiChar nehmen.
PWideChar wird es mit großer Wahrscheinlichkeit nicht sein.

Neben cdecl und stdcall gibt es noch ein paar Varianten mehr, aber Anderes hab ich hier auch noch nicht gesehn. (außer selten mal savecall und in Delphi natürlich pascal)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:53 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