Forum: PC-Programmierung Kann Dll nicht laden (MPUSBAPI.DLL)


von As B. (b-a)


Lesenswert?

Ich benutze Visual C++ Express SP1 mit SDK Platform.
Ich möchte die DLL MPUSBAPI.DLL einbinden um mit einem 
PIC-Mikrocontroller über USB zu kommunizieren.
Die Datei ist in meinem System32 Ordner und im Projektverzeichniss. Die 
Header-Datei ist auch mit include eingebunden. Leider kommt beim Laden 
der DLL der Fehler, das die Datei nicht geladen werden kann.
Habe im Internet gesucht und Anleitungen gefunden, aber es hat trotzdem 
nicht funktioniert.

Wer kann mir weiterhelfen?

Dirk

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Leider kommt beim Laden der DLL der Fehler, das die Datei
> nicht geladen werden kann.

Wie "lädst" Du denn die DLL?

Quelltext?

von booster (Gast)


Lesenswert?

Ich hatte auch schon mal ein Problem mit einer DLL, war zwar korrekt 
eingebunden, jedoch beim Ausführen gabs Probleme. Grund war der, das die 
DLL eine weitere DLL benötigte, welche ich nicht eingefügt hatte.

Ich hab damals ein Programm gefunden, welches die Abhängigkeiten von 
anderen DLLs untersucht, und Fehler aufzeigt.

Das Programm heißt: Dependency Walker (von MS)

Vieleicht hilft das weiter.

von As B. (b-a)


Lesenswert?

Mit dem Befehl Loadlibrary lade ich die DLL.
Die Header sind mit include eingebunden.
Muss man überhaupt mit Loadlibrary die DLL laden?

Mit dem USB-Board vom Conrad hatte ich nicht die Probleme.

Danke schonmal für die Tipps

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was Du anscheinend versuchst, ist dynamisches Laden der DLL, also erst 
zur Laufzeit.

   LoadLibrary("meineiegene.dll")

gibt ein Handle auf die DLL zurück; schlägt das Laden fehl, wird NULL 
zurückgegeben. Die Fehlerursache kann man in diesem Falle mit der 
Funktion GetLastError() bestimmen - der von dieser zurückgegebene 
Fehlercode sagt an, was nicht ging.

Dazu ist keinerlei die DLL beschreibende Headerdatei erforderlich, die 
ist erst dann erforderlich, wenn Funktionen aus der DLL aufgerufen 
werden sollen - wobei das beim Laden der DLL zur Laufzeit recht 
kompliziert ist.

Der üblichere Fall der Verwendung einer DLL ist die Verwendung einer 
Importlibrary - diese enthält Funktionsstummel ("stubs"), die sich der 
Anwendung gegenüber so verhalten, als ob die DLL eine statisch zur 
Anwendung gelinkte Library wäre. Die DLL wird hier vom Betriebssystem 
geladen, bevor das eigentliche Programm ausgeführt wird; schlägt das 
Laden fehl, gibt es eine Betriebssystemfehlermeldung und das Programm 
wird gar nicht erst aufgerufen.
Üblicherweise heißt die Importlibrary genauso wie die betreffende DLL, 
nur daß die Extension *.lib verwendet wird.

Ist eine mit einer Importlibrary gelinkte Anwendung aber korrekt geladen 
worden, können die in der DLL befindlichen Funktionen direkt aufgerufen 
werden - die dafür erforderlichen Funktionsprototypen stehen in der 
Headerdatei.

Im Gegensatz dazu muss nach dem Laden einer DLL mit LoadLibrary() für 
jede aufzurufende Funktion ein Funktionspointer bestimmt werden - dazu 
dient die API-Funktion GetProcAddress. Erst wenn die Funktionspointer 
bestimmt sind, können die dazugehörigen Funktionen aufgerufen werden.

Vorteil dieser Methode: Auch ohne DLL kann ein Programm funktionieren, 
nur die in der DLL definierten Funktionen stehen nicht zur Verfügung. 
Das Programm kann eine benutzerfreundlichere Fehlermeldung als "DLL 
nicht gefunden" von sich geben und dem Anwender auch die Möglichkeit 
anbieten, die betreffende DLL von irgendwo anders zu laden. Nachteil ist 
halt der erhöhte Aufwand.

Was Dein Problem angeht, bestimme doch erstmal den Rückgabewert von 
LoadLibrary und gebe den Rückgabewert von GetLastError bei Fehlschlag 
aus.

von As B. (b-a)


Lesenswert?

Okay, ich habe eine *.h eine *.dll und eine *.lib
Steht include "mpusbapi.h" in der Datei stdafx bringt er 
Fehlermeldungen.
Steht include "mpusbapi.h" in meiner *.cpp Datei, kann er es 
compilieren.

Wie binde ich die *.lib Datei ein?

Fehler ist 126, den ich mit GetLastError bekomme.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Wie binde ich die *.lib Datei ein?

Indem Du die Library zu Deiner Projektverwaltung hinzufügst.

## folgendes ist Microsoft-spezifisch ##

Oder indem Du in eines Deiner Sourcefiles folgende Zeile einfügst:

  #pragma comment(lib, "mpusbapi")

Am besten gehört diese Zeile in die Headerdatei "mpusbapi.h".

## Microsoft-spezifisch bis hier ##

Wenn es Dir gelungen ist, die Importlibrary zu Deinem Projekt 
hinzuzufügen und Dein Projekt zu übersetzen, kannst Du die Funktionen 
aus der Dll direkt aufrufen, "LoadLibrary" und Konsorten musst (und 
darfst) Du jetzt nicht mehr verwenden.

## MS-Spezifisch ... ##

Damit Du das Programm im VC-Debugger ausführen kannst, musst Du die DLL 
in das .\Debug-Verzeichnis Deines Projekts kopieren.

## MS-spezifisch bis hier ##


Fehler 126 ist übrigens ERROR_MOD_NOT_FOUND (aus error.h)

Da wird wohl der an LoadLibrary übergebene Pfad nicht stimmen.

Im übrigen:

> Steht include "mpusbapi.h" in der Datei stdafx bringt er
> Fehlermeldungen.

Du verstehst schon, wie unbefriedigend so eine Aussage ist? "Er" (wer?) 
bringt Fehlermeldungen.

WELCHE?! Hast Du Dir die Fehlermeldungen mal angesehen (immer mit der 
ersten beginnnen) und versucht zu verstehen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.