DLL Import



  • Hallo zusammen!

    Ich habe ein Problem, an welchem ich seit 2 Tagen sitze und komme aufgrund des "Zeitmangels" der Diplomarbeit langsam ins schwitzen...

    Ich muss eine Software für einen Roboter entwickeln und benötige dazu eine Bibliothek.
    Nun liefte der Hersteller aber lediglich ein Ordner voller dll Dateien. Ich habe nun versucht folgendermassen eine dll zu importieren:

    HMODULE hMod = LoadLibrary(L"DobotDllM1.dll");
    	if (!hMod) {
    		cout << "Can't load Library" << endl;
    		EXIT_FAILURE;
    	}
    

    Im Debug Output finden sich komische Zeilen:

    DobotDllM1.dll" geladen. Das Modul wurde ohne Symbole erstellt.
    DobotDllM1.dll" wurde entladen.

    sowie diverse :
    PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.

    Lade ich beispielsweise die kernel32.dll Datei, funktioniert es einwandfrei.

    Die dll Datei lässt sich anschauen und die Funktionen sind vom Hersteller so auch Dokumentiert.

    Da ich mich nicht in der Informatik bewege sondern in Richtung Systemtechnik studiere, habe ich bisher noch zu wenig Erfahrung um diesem Fehler selber zu beheben... Auch weil ich mit Java gestartet habe und nun zur Horizonterweiterung C++ benutze.

    Vielen Dank schon mal fürs lesen meines Beitrages und ich hoffe, jemand weis bescheid :face_with_stuck-out_tongue:
    Baumi



  • @baumi7 sagte in DLL Import:

    Im Debug Output finden sich komische Zeilen:
    DobotDllM1.dll" geladen. Das Modul wurde ohne Symbole erstellt.
    DobotDllM1.dll" wurde entladen.
    sowie diverse :
    PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.

    Sagt nur, daß die DLL ohne Debug-Symbole gebaut wurde. Wenn der Hersteller keine DLLs liefert, die fürs Debuggen gebaut sind, dann ist das kein Fehler, der behoben werden müsste.



  • Okay super danke, da wäre schon mal etwas geklärt. Wieso aber wird die DLL nicht geladen? Also wieso ist hMod = NULL? Im Debug so wie im Run...
    Ich muss die DLL ja laden um die Funktionen zu verwenden...



  • Wird diese DLL denn korrekt im Dependency Walker geladen und die exportierten Funktionen angezeigt?

    Und laut Dobot API Reference and Developing Examples sollten aber (wenigsten eine) Headerdatei(en) mitgeliefert sein, denn sonst müßtes du ja selber die Signaturen der Funktionen erstellen (entweder für die dynamischen Aufrufe oder dann doch selber eine Headerdatei dafür erstellen).



  • Um den Fehler einzugrenzen, hilft es im Fehlerfall GetLastError()aufzurufen. Das gibt zusätzliche Hinweise zum Problem.



  • @theta sagte in DLL Import:

    Um den Fehler einzugrenzen, hilft es im Fehlerfall GetLastError()aufzurufen. Das gibt zusätzliche Hinweise zum Problem.

    Mit GetLastEroor() wird der Fehler 126 ausgegeben...

    @th69 sagte in DLL Import:

    Wird diese DLL denn korrekt im Dependency Walker geladen und die exportierten Funktionen angezeigt?

    Die DLL Wird mit einer Fehlermeldung geladen. Die Funktionen werden aber alle angezeigt wie in Ihrem API Dokument beschrieben. Folgendes wird mehrfach ausgegeben:
    Error opening File. Das System kann die angegebene Datei nicht finden(2)

    Und laut Dobot API Reference and Developing Examples sollten aber (wenigsten eine) Headerdatei(en) mitgeliefert sein, denn sonst müßtes du ja selber die Signaturen der Funktionen erstellen (entweder für die dynamischen Aufrufe oder dann doch selber eine Headerdatei dafür erstellen).

    Ich habe auf Anfrage lediglich einen Ordner voller DLL Dateien erhalten sowie 2 .cs Dateien, welche ja warscheinlich für c# sind.... Das einzige, was der Hersteller zum Download verfügbar macht, ist die Software M1 Studio.... Ich habe jetzt explizit ein header file und ein .lib angefordert.

    Kann das evtl sein, dass die DLL mit C# erstellt wurde und ich die jetzt mit C++ laden will??



  • @baumi7 sagte in DLL Import:

    Mit GetLastEroor() wird der Fehler 126 ausgegeben...

    Das bedeutet

    The specified module could not be found.

    Guckst Du Dynamic-Link Library Search Order.



  • @Baumi7: Taucht im "Dependency Walker" als erste DLL "MSCOREE.DLL" auf (links oben in der Baumansicht)? Dann ist es auf jeden Fall eine .NET-DLL (eine sog. "Assembly"), mit der du dann von nativen C (oder C++) nicht darauf zugreifen kannst.

    Wenn du keine andere DLL hast, dann müßtest du im Visual Studio ein "C++/CLI"-Projekt erstellen, mit dem du dann per C++ darauf zugreifen kannst (wäre aber eine größere Hürde, wenn du bisher noch nicht mit .NET programmiert hast) oder natürlich gleich in C#. Besser wäre es wohl, du erhältst von der Firma das komplette SDK.



  • Wenn es wirklich ein .NET DLL (im .NET jargon Assembly genannt) ist dann sind alle Informationen welche Methoden/Klassen die DLL bietet in der DLL selbst enthalten.
    In einem C# projekt muss dann nur diese DLL als Assembly reference hinzugefügt werden.



  • Das würde auch erklären, warum keine Headerdatei dabei ist (aber C#-Dateien). 💡



  • Ich habe den Fehler gefunden. Wie erwartet etwa das Dümmste was passieren kann 🤦🏻♂
    Ich habe nur eine DLL kopiert und versucht zu öffnen. Nun habe ich den gesamten Ordner kopiert und daraus die dll geöffnet. Da vermutlich die eine DLL verschiedene Verknüpfungen hat, konnte sie deshalb nicht geöffnet werden. Darauf bin ich jedoch durch den Dependency Walker gestossen also danke für den Tipp!!
    Sorry für die Störung wegen eines so dämlichen fehlers 😕
    Vielen Dank auf jeden Fall für die Hilfe!!!

    Gruss Baumi