Laden...

DLLImport - Problem

Erstellt von typhos vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.185 Views
T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren
DLLImport - Problem

Hi,
ich versuche eine unmanaged DLL per DLLImport einzubinden. Beim Aufruf der eingebundenen Methode erhalte ich aber eine DllNotFoundException "Das angegebene Modul kann nicht gefunden werden".
Die DLL liegt aber im gleichen Verzeichnis wie die DLLs des Projekts (also im bin-Verzeichnis).
Kann er wirklich die DLL nicht finden oder liegt das an was anderem?

Vielen Dank schon mal!

2.223 Beiträge seit 2005
vor 17 Jahren

moin

versuche die dll doch mal ins Projekt mit einzubinden

denke das dein bin verzeichniss nicht mit im suchpfad hängt

mfg

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Hi,
ich habe die DLL nun mal mit DependencyWalker geöffnet und festgestellt, dass sie noch von zig anderen DLLs abhängig ist. Gut, also habe ich mir die anderen DLLs auch besorgt und in das bin-Verzeichnis kopiert.
Anscheinend wird nun alles gefunden. Allerdings bekomme ich nun einen anderen Fehler:

"Eine DLL-Initialisierungsroutine ist fehlgeschlagen"

Was bedeutet das jetzt? Ist mein Aufruf der Funktion falsch oder stimmt etwas anderes nicht?
Wenn ich die DLL nun mit DependencyWalker öffne, fehlt zumindest keine DLL mehr, aber er markiert die MPR.DLL rot und gibt mir folgende Meldung:
"Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module."
Die MPR.DLL ist doch eine Systemdatei, richtig? Die muss doch also in Ordnung sein 🤔

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Hat denn wirklich niemand eine Idee, woran es liegen könnte? Ist die DLL fehlerhaft oder gar nicht zu gebrauchen oder kann der Fehler auch am Aufruf der Methode liegen?
Vielleicht noch ein paar Einzelheiten:
Die DLL, um die es geht, wurde mit Gupta/Centura frisch erstellt. Damit kenne ich mich zwar nicht aus, aber anscheinend werkelt beim Kompilieren auch irgendein C/C++ Compiler - zumindest stand da irgendetwas von "C++ Compiler".

Wenn ich die DLL im DependencyWalker öffne, wird mir die gewünschte Funktion auch in der "Export Function List" angezeigt. Weiterhin kenn ich die Parameter, die diese Funktion benötigt:

BOOL Funktion(HSTRING, BOOL, BOOL, LPHSTRING)

In meinem Projekt binde ich die Funktion so ein:

[DllImport("NAME.DLL")]
public static extern bool Funktion(string prm1, bool prm2, bool prm3, ref string prm4);

Beim Aufruf dieser Methode erhalte ich dann den besagten Fehler:

HRESULT: 0x8007045A Eine Initialisierungsroutine ist fehlgeschlagen.

Wäre wirklich toll, wenn mir doch noch jemand helfen könnte.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Beim Laden einer DLL wird eine Initialisierungsfunktion aufgerufen. Diese meldet einen Fehler. Hat erstmal mit deinem Code nix zu tun, denn diese Routine wird automatisch durch LoadLibary aufgerufen. Dein eigentlicher Call ist da noch gar nicht erfolgt.

Aber, das alles wird eh nix: HString ist ein Centura-spezifischer Typ. Damit kann niemand etwas anfangen außer Centura.

Kurz gesagt: In der Form ist die DLL nicht in anderen Programmiersprachen nutzbar. Du musst da char*, LPSTR oder so draus machen.

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Hmm, auch wenn ich mir das schon fast gedacht habe, ist die Antwort nicht unbedingt die, die ich hören/lesen wollte X(
Gibt es vielleicht eine Möglichkeit, die DLL "anders" zu kompilieren bzw. zu konvertieren? Die DLL in C# neu zu erstellen wäre prinzipiell zwar möglich, aber ein riesiger (unerwünschter) Berg Arbeit 🙁