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
> Leider kommt beim Laden der DLL der Fehler, das die Datei > nicht geladen werden kann. Wie "lädst" Du denn die DLL? Quelltext?
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.
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
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.