PDA

Vollständige Version anzeigen : c++ dll aufrufen


procon
26.10.2003, 10:41
Schönen Sonntag,

habe ein Problem, mit einer c++ dll die ich aus access 2000 mit VBA aufrufen
soll.
Folgendes:

Die dll xyz.dll soll geladen werden, hat aber nur Aufrufkonventionen der Form __cdecl, die Funktionen könne also mit VB nicht aufgerufen werden.
Deshalb wurde vom Programmierer ein sogenannte router.dll mit
den Aufrufkonventionenn _stdcall erstellt. Diese dll routet die Aufrufe
der Funktionen nun zu der xyz.dll durch.
Ich habe zum Test eine testdll.exe erhalten die nun die router.dll aufruft
und die Funktionen der xyz.dll testet.
Die funktionen load_dll, init_dll und free_dll werden getestet, wobei die
load_dll die xyz.dll läd, mit init_dll werden Grundeinstellungen geladen und
mit free_dll wird die dll wieder entladen.
Mit der .exe funktioniert alles wunderbar.
Wenn ich nun die dll in VB mit declare Anweisungen aufrufe(also private declare funktion etc.) und die oben genannten Funktionen
testen will wird die xyz.dll nicht geladen.
Ebenso habe ich schon versucht mit loadlibrary und getprocaddress
die yxz.dll zu laden und die Funktionen aufzurufen, nichts geht, die dll
wird nicht geladen.
Völlig rätselhaft ist mir, warum die exe die dll laden kann und ich mit VB
keinen Erfolg habe.

Der Programmierer der dll hat keine Ahnung von VB.

Hat von Euch jemand einen Tipp?

Anmerkung Moderator: Dieser Beitrag ist eine Fortsetzung von diesem:
http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=104463

littlesven
26.10.2003, 11:52
Hallo,

wenn ich das richtig verstehe musst Du die Router.dll in VB aufrufen. Du schreibst aber, dass Du die xyz.dll laden willst.

Grüße aus Offenbach

Sven

procon
26.10.2003, 12:14
Hallo littlesven,
:confused: bin schon etwas gestresst, weils nicht funzt.
Also ich muss die router.dll aufrufen um die Funktionen der xyz.dll
nutzen zu können. Die testdll.exe funktioniert einwandfrei ruft die
router.dll auf und gibt die entsprechende Rückmeldungen der xyz.dll aus.

Wenn ich in das in VB durchführe kann ich zwar die router.dll laden,
aber die xyz.dll gibt keine Rückmeldung, ich erhalte die error_meldung
-1000, d.h. die xyz.dll konnte nicht geladen werden.

Testweise habe ich nun versucht die xyz.dll mit loadlibrary zu laden,
die dll wird nicht geladen.
Ich frage mich nun, warum funktioniert das Ganze mit der testdll.exe
und nicht in VB.

Vielleicht kannst du mir helfen?

Sascha Trowitzsch
26.10.2003, 12:43
MS WIN32 Help:
A call to LoadLibrary by one process does not produce a handle that another process can use - for example, in calling GetProcAddress. The other process must make its own call to LoadLibrary for the module before calling GetProcAddress.

Das heißt, dass das Laden der DLL in VB nichts nützt, weil sie der router.dll deshalb noch nicht zur Verfügung steht.

Ich verstehe es nicht: Wenn die router.dll Funktionen aus der xyz.dll aufruft, dann wird diese doch implizit geladen. Das muss eigentlich nicht extra noch in VB geschehen.
Oder was hat der C++-Mensch da fabriziert?? Frag ihn mal, denn ich nehme stark an, dass er der einzige ist, der dir da weiterhelfen kann.
Hier im Access-Forum bist du da garantiert an der völlig falschen Adresse!

Ciao, Sascha

procon
26.10.2003, 14:36
Hallo Sascha,
ich denke der Programmierer hat schon das richtige gemacht, so weit ich das verstehe. Die router.dll war nötig, weil die xyz.dll nur _stdecl Aufrufkonventionen besitzt, der progi hat dafür die router.dll geschaffen die nun die _stdcll Aufrufkonventionen hat.

Also zur exe:(kurzfassung)
Die testdll.exe ruft mit loadlibrary und getprocaddress diesub der router.dll auf z.B. sub load.
Die sub load lädt die xyz.dll mit loadlibrary, getprocaddress und ruft die Funktion loaddll der xyz.dll auf.
die router.dll erhält dann Rückmeldung z.B. "xyz.dll erfolgreich geladen" die dann in einem Konsolen-Fenster der testdll.exe zu sehen ist um das laden der xyz.dll anzuzeigen.
Dann geht es weiter mit der funktion init um die xyz.dll zu initialisieren,
der Erfolg wird wieder im Fenster der testdll.exe angezeigt.

Mit diesen Aufrufen soll das erfolgreiche laden der xyz.dll getestet werden

das gleiche in VB:
Mit declare function werden die subload und funktion init der router.dll deklariert. Ich starte die sub command1_Click und rufe die sub load der router.dll, die führt nun das gleiche durch wie im aufruf der exe, mit loadlibrary und getprocaddress wird die xyz.dll geladen und die loaddll funktion der xyz.dll aufgerufen. Nun schreibt die router.dll in eine log.dat
das Ergebnis des Ladens, und jetzt den fehler (xyz.dll nicht geladen).

Da hängt es nun seit Tagen, ich verstehe nicht warum die gleichen Aufrufe zu einem unterschiedlichen Ergebnis führen.

Die Erklärung aus der MS WIN32 Help kann glaub ich nicht die Ursache des Fehlers sein.
Ich habe nur zu Testzwecken die xyz.dll mit loadlibrary gerufen um sicher zu sein das die router.dll keinen fehler macht, der Aufruf erfolgte so:

dim lngret as long
dim lngproc as long
ret = loadlibrary ("xyz.dll") 'natürlich mit dem richtigen Pfad
lngproc = getprocaddress(ret, "loaddll")
FreeLibrary ret

schon ret bringt kein handle

Hast du dafür eine Erklärung?

Grüße Günther

Sascha Trowitzsch
26.10.2003, 15:32
Kann ich dir nicht sagen. Ich blicke bei dem DLL-Wirrwarr nicht durch.

Mit ist schon klar, wozu die router.dll benötigt wurde - ist ja aus deinem früheren Beitrag hervorgegangen -, ich verstehe aber nicht, was solche Funktionen wie loaddll der xyz.dll sollen. Wenn sie von router schon mit loadlibrary geladen wurde, was soll dann noch loaddll machen? Dann noch initDll...

Man kann beim besten Willen aus der Ferne nicht wissen, was da wozu ablaufen muss, ohne eine gescheite Dokumentation der beiden DLLs zu haben.

Sorry, Sascha

procon
26.10.2003, 16:31
Hallo Sascha,
sorry es ist wirklich wild durcheinander.
Wollte niemanden mit den dll's bequatschen :blabla: hab mittlerweile
schon eine Ahnung von c++ und den dll's.
und was welche sub oder funktion tut oder nicht tut.

Was mir nicht in den Kopf geht ist, das die API Funktion
loadlibrary mit der exe funktioniert und mit VB nicht und das in der
gleichen dll nämlich der router.dll

Dafür wollte ich eine Erklärung
Ansonsten Danke für die Hilfe.

Gruß Günther