Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL-Funktion aus einer anderen DLL aufrufen. (https://www.delphipraxis.net/193839-dll-funktion-aus-einer-anderen-dll-aufrufen.html)

DerNutzer 14. Sep 2017 09:47

DLL-Funktion aus einer anderen DLL aufrufen.
 
Guten Tag,

ich stehe momentan vor einem Problem, wo ich trotz intensiver Suche keine Lösung gefunden habe. Vielleicht findet hier jemand eine Lösung:

Ich habe eine Treiber-DLL von einem Fremdanbieter und möchte dessen Funktionen in meiner eigenen DLL aufrufen. Die Funktionsaufrufe habe ich bisher statisch in einer Anwendung ohne Probleme eingesetzt. Wenn ich jetzt aber exakt die selben Aufrufe in meiner DLL verwenden möchte, dann bleibt meine DLL beim Funktionsaufruf hängen.

Frage: Was übersehe ich hier?

Definition des statische Beispiel:

function ps5000aOpenUnit (var handle : smallint; serial : pointer; Modus : smallint) : smallint;
{$IFDEF WIN32} stdcall; external 'ps5000a.dll' {$ENDIF}

Wie gesagt in EXE ohne Probleme, in DLL dagegen Hänger.

uligerhardt 14. Sep 2017 12:56

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Vermutlich muss das stdcall immer gesetzt sein, unabhängig von WIN32.

Edit: (Wobei das nicht selber setzen solltest.)

jaenicke 14. Sep 2017 13:27

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Vielleicht fehlt die OLE Initialisierung? (CoInitialize usw.)

Zitat:

Zitat von uligerhardt (Beitrag 1381151)
Vermutlich muss das stdcall immer gesetzt sein, unabhängig von WIN32.

Unter 64-Bit gibt es nur noch eine Aufrufkonvention, egal was man hinschreibt.

DerNutzer 14. Sep 2017 13:30

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Zitat:

Vermutlich muss das stdcall immer gesetzt sein, unabhängig von WIN32.
Danke für den Tipp. Allerdings ist das nicht des Rätsels Lösung. Es hängt weiterhin. :shock:

Zitat:

Vielleicht fehlt die OLE Initialisierung? (CoInitialize usw.)
Das werde ich morgen mal checken. Erstmal vielen Dank! :thumb:
PS: Hab es gleich noch überprüft. Und es ergibt keine Änderung.

Was macht eine EXE anders beim Aufruf einer Funktion aus einer DLL als eine DLL?

Zacherl 14. Sep 2017 15:19

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Kannst du noch ein paar zusätzliche Infos liefern?

- Was soll der Funktionsaufruf bewirken?
- Hängt es wirklich genau bei diesem Aufruf, oder vielleicht doch an anderer Stelle?
- Wie sieht deine Dll Main aus? Ist hier evlt. schon etwas falsch wie z.b. eine blockierende MessageQueue
- Hängt die Dll auch OHNE den spezifischen Funktionsaufruf?

Normalerweise ist es absolut kein Problem Funktionen aus Dlls in einer Dll aufzurufen.

DerNutzer 14. Sep 2017 18:08

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Der Funktionsaufruf dient der Verbindungsaufnahme mit einem PicoScope (Oszilloskop) und funktioniert, wie schon geschrieben, in einer Exe problemlos. Die Funktion liefert dabei einen Handle auf das Gerät zurück. Beim Aufruf kann man noch eine Seriennummer übergeben um ein spezifisches Gerät anzusprechen (übergibt man dort NIL wird das Erstbeste angesprochen) und der Modus beschreibt einfach die Auflösung der Abtastung (16 bit bis 8 bit).

Und der Debugger bleibt genau bei diesem Funktionsaufruf stehen und nur ein Beenden der Anwendung löst das Problem.

Die DLLmain ist bis auf den Funktionsaufruf leer. Ich habe extra eine neue DLL für die Fehlersuche angelegt. :)

Und der Rest der DLL funktioniert ohne den Aufruf bestens.

Und ich verwende ein Delphi XE3 unter Windows 10.

Luckie 14. Sep 2017 18:13

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Wird die Treiber DLL denn von deiner DLL geladen? Statisch? Dynamisch? Guck doch mal mit dem Prozessexplorer, ob sie überhaupt gefunden und geladen wird. Ich würde es mal mit dynamischen Laden probieren, da sieht man gleich beim Aufruf von LoadLibrary, ob da schon was schief geht.

Zacherl 14. Sep 2017 18:55

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Zitat:

Zitat von DerNutzer (Beitrag 1381203)
Die DLLmain ist bis auf den Funktionsaufruf leer. Ich habe extra eine neue DLL für die Fehlersuche angelegt. :)

Da wird das Problem liegen. In der DllMain sollte man nie komplexen Code ausführen. Dass ansonsten unerwünschtes Verhalten auftreten kann ist von MS auch dokumentiert:
https://msdn.microsoft.com/en-us/lib...best_practices

DerNutzer 14. Sep 2017 19:49

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Zitat:

Ich würde es mal mit dynamischen Laden probieren, da sieht man gleich beim Aufruf von LoadLibrary, ob da schon was schief geht.
Auch das habe ich versucht. Das Resultat war auch da ein Hänger. ;-)

Zitat:

Da wird das Problem liegen. In der DllMain sollte man nie komplexen Code ausführen.
Sollte da die Lösung liegen? Das versuche ich morgen mal. Daran habe ich mit keiner Silbe gedacht. Vielen Dank für den Tipp. :thumb:

Zacherl 14. Sep 2017 20:21

AW: DLL-Funktion aus einer anderen DLL aufrufen.
 
Zitat:

Zitat:

Da wird das Problem liegen. In der DllMain sollte man nie komplexen Code ausführen.
Sollte da die Lösung liegen? Das versuche ich morgen mal. Daran habe ich mit keiner Silbe gedacht. Vielen Dank für den Tipp. :thumb:
Bin mir ziemlich sicher. Lager deinen Funktionsaufruf einfach testweise mal in eine dedizierte exportierte Funktion aus, die du dann aus dem Hauptprogramm aus aufrufst.


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