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 Rückgabeparameter DLL analysieren (https://www.delphipraxis.net/199478-rueckgabeparameter-dll-analysieren.html)

zeras 25. Jan 2019 19:15

Rückgabeparameter DLL analysieren
 
Ich habe eine 32 Bit DLL, die funktioniert. Nun habe ich auch eine 64 Bit vom selben Hersteller bekommen. Diese macht Probleme. Zuerst habe ich mein Projekt mal testweise auf 64 Bit umgestellt, da diese offenbar auch nur mit der 64 Bit Variante zurechtkommt.
Nun habe ich in dieser DLL eine Funktion, die mehrere Parameter zurückgibt. Diese scheinen aber nicht mehr zu passen.
Der Aufruf sieht so aus

Delphi-Quellcode:
function FindFirstx(hier stehen einige Parameter
                          var fInfo1 : _xINFO;
                      ): Boolean stdcall; external NameDLL name 'FindFirstx';
Gibt es eine Möglichkeit, sich die Rückgabeparameter erst einmal "roh" anzuschauen? Vielleicht ist die Deklaration bei 64 auch anders als bei 32.
Wenn ich einen Hexcode bzw. String anschauen könnte, wäre das erst einmal ausreichend.
Reichen die Infos oder muss ich genauer erklären?

Der schöne Günther 25. Jan 2019 19:28

AW: Rückgabeparameter DLL analysieren
 
Nicht wirklich, oder? Tools wie Dll export viewer zeigen dir an was exportiert wird, aber die Parameter kann man doch nicht wissen, oder?


Meine Vermutung wäre eher dass sich in 64 Bit an der Größe der Parameter etwas ändert, z.B. weil es auf der Delphi-Gegenseite falsch definiert wurde und ein Typ verwendet wurde der sich nicht mitänderte.

Fritzew 25. Jan 2019 19:30

AW: Rückgabeparameter DLL analysieren
 
Etwas mehr Information wäre schon schön...
Wie ist _xINFO definiert etc....
gibt es eine *.h Datei zur DLL?
oder liefert der Hersteller eine *.pas?

hoika 25. Jan 2019 19:41

AW: Rückgabeparameter DLL analysieren
 
Hallo,
wenn _xINFO ein Record ist, muss man auch noch das ev. geänderte Alignment der Parameter berücksichtigen.

Zitat:

Reichen die Infos oder muss ich genauer erklären?
Nein und Ja.

zeras 25. Jan 2019 19:44

AW: Rückgabeparameter DLL analysieren
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1424164)

Meine Vermutung wäre eher dass sich in 64 Bit an der Größe der Parameter etwas ändert, z.B. weil es auf der Delphi-Gegenseite falsch definiert wurde und ein Typ verwendet wurde der sich nicht mitänderte.

Das vermute ich und daher wollte ich schauen, ob die Parameter vielleicht da sind, nur falsch interpretiert werden.

Zitat:

Zitat von Fritzew (Beitrag 1424165)
Etwas mehr Information wäre schon schön...
Wie ist _xINFO definiert etc....
gibt es eine *.h Datei zur DLL?
oder liefert der Hersteller eine *.pas?

Die _xINFO ist eine Struktur, die in der 32 Bit Variante u.a. AnsiChar enthält. Vielleicht hat die 64 Bit Variante Char als Typ. Das wollte ich rausfinden, indem ich vielleicht auf alle Rückgabeparmeter zugreifen kann.
Es gibt eine Headerdatei und diese heißt auch xxxxx32.h. Eine xxxxx64.h habe ich nicht bekommen. Leider gibt es keine *.pas hierzu.

Fritzew 25. Jan 2019 20:05

AW: Rückgabeparameter DLL analysieren
 
Da Du ja nicht bereit bist mehr Informationen zu liefern :roll:

Leg Dir einen Buffer an:

TInfo_xInfo = Array[0..4096] of byte. Grösser als dein Struct

fülle den mit 0 oder was auch immer und lass in auf Deine Dll los.

Dann kannst Du ja schauen was drin steht

zeras 25. Jan 2019 20:52

AW: Rückgabeparameter DLL analysieren
 
Zitat:

Zitat von Fritzew (Beitrag 1424169)
Da Du ja nicht bereit bist mehr Informationen zu liefern :roll:

Weiter oben hatte ich ja weitere Infos gegeben.
Ich weiß aber nicht so recht, ob ich die Strukturen offenlegen darf. Deswegen nur die Ansätze.


Zitat:

Zitat von Fritzew (Beitrag 1424169)

Leg Dir einen Buffer an:

TInfo_xInfo = Array[0..4096] of byte. Grösser als dein Struct

fülle den mit 0 oder was auch immer und lass in auf Deine Dll los.

Dann kannst Du ja schauen was drin steht


Das klingt ja nicht schlecht. Werde das mal probieren und schauen, ob ich da mehr sehe.

Danke trotzdem.

zeras 26. Jan 2019 14:10

AW: Rückgabeparameter DLL analysieren
 
Zitat:

Zitat von Fritzew (Beitrag 1424169)

Leg Dir einen Buffer an:

TInfo_xInfo = Array[0..4096] of byte. Grösser als dein Struct

fülle den mit 0 oder was auch immer und lass in auf Deine Dll los.

Dann kannst Du ja schauen was drin steht

Das habe ich nun getan und im Fehlerfalle wird einfach kein einziges Byte aus dem Array geändert, obwohl die Funktion erfolgreich meldet.
Ich muss nun auf den Hersteller zugehen, damit er das nochmal testet. Er kann ja in die Quellen der DLL schauen im Gegensatz zu mir.

Danke nochmals für den Tipp.

TiGü 28. Jan 2019 07:50

AW: Rückgabeparameter DLL analysieren
 
Zitat:

Zitat von zeras (Beitrag 1424171)
Zitat:

Zitat von Fritzew (Beitrag 1424169)
Da Du ja nicht bereit bist mehr Informationen zu liefern :roll:

Weiter oben hatte ich ja weitere Infos gegeben.
Ich weiß aber nicht so recht, ob ich die Strukturen offenlegen darf. Deswegen nur die Ansätze.

Kopiere die Definition aus der Header-Datei und deine Delphi-Übersetzung hier rein und ersetze Funktions- und Parameternamen gegen etwas unverfängliches.

Also statt
Code:
int makeMeRich(int Bernsteinzimmer, char* Weltformel);
schreibst du
Code:
int myFunction(int a, char* b);
Möchte Bits und Byte wetten, dass du Schindluder bei den Datentypen getrieben hast und bspw. Cardinal anstatt SIZE_T oder PChar anstatt PByte oder Integer anstatt THandle oder oder oder bei deiner Übersetzung genommen hast.

zeras 28. Jan 2019 18:44

AW: Rückgabeparameter DLL analysieren
 
Hier die originale Deklaration in C
Code:
XSX_BOOL L_EXPORTS FindFirstx(
                          int32 par1,
                          const char    *par2,
                          uint8          par3,
                          uint8          par4,
                          int32          *par5,
                          char          *par6,
                          uint32_t       par7);
die ich so übersetzt habe:
Delphi-Quellcode:
function FindFirstx(
                       par1           : int32;
                       const par2: arDataTcp; //= array[0..1000] of Ansichar;
                          par3          : BYTE;
                          par4      : BYTE;
                          var par5   : int32;
                          var par6  : arDataTcp; //= array[0..1000] of Ansichar;
                          par7     : uint32
                      ): Boolean stdcall; external NameDLL name 'FindFirstx';
Ist da was falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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