[gelöst] QLibrary / DLL in Klasse (Warning Multiple Declare)

Du bist neu in der Welt von C++? Dann schau hier herein!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ups:
änder mal

Code: Alles auswählen

extern c  
zu

Code: Alles auswählen

extern "C" 

@franzf
Eigentlich sollt er lernen wie man es richtig macht !
und spaetestens wenn er structuren und typen fuer den Export definiert, brauch er die .h auch im dll-client, dann wird das umschalten extentiell :-)

CIao ...
Zuletzt geändert von RHBaum am 7. Juni 2010 16:03, insgesamt 1-mal geändert.
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

Beitrag von Pixtar »

@franzf: Ja, deine Methode funktioniert ebenso unter Windows Systemen. Habe es gerade getestet und bin überrascht, das Libs auch einfach aufgebaut sein können .. wie du bereits sagst. Ohne Header und ifdef defend blubb blah .. :wink:

@RHBaum: Danke, das war der letzte Fehler. Jetzt funktioniert es einwandfrei. --> *laut vor Freude aufschrei*

So, ich hoffe ich muss jetzt nicht noch einmal in diesen Thread rein - er gibt aufjedenfall ein gutes Tutorial für andere ab, die vor dem selben Problem stehen.

Grüße,
Pixtar

PS: Danke für alle Hilfestellungen!
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

Beitrag von Pixtar »

Ein letztes Mal noch werde ich dieses Thema hoffentlich in anspruch nehmen.
Es geht wie am Anfang der Diskussion eigentlich um MixedCompilers.

Ich habe eine DLL die ist mit VB v.6.0 (C++) erstellt worden ist.
Die Kompilierung ist aber ohne namemergling erfolgt.
Wenn ich den dependencywalker oder den pexports über die DLL schicke und mir ein Definition File ausgeben lasse stehen die Funktionnamen in Klartext dort. (Kein Namemergling)

Das scheint aber nicht das einzige Problem zu sein bei der Benutzung anderer Kompiler für DLLs.
Denn wenn ich die DLL in meinen jetzigen Algorithmus einbinde, sagt er mir immer wieder, dass die DLL nicht geladen werden kann. [QLibrary::load()]

Wenn ich mir aber den Artikel Mixing Compilers bei MinGW ansehe, scheint es so als würde eine MSVC DLL mit dem MinGW mitlerweile funktionieren.
Even though GNU g++ can link MSVC C++ libraries now
Warum es wiederum nicht funktionieren könnte ist folgende Aussage:
But there is the fundamental conflict of different underlying exceptions and memory models.
Na was denn nun? Funktioniert das oder funktioniert das nicht?
Wie gesagt es gibt lediglich das DLL-File.
Wenn das nicht funktioniert - gibt es ein Workaround wie man es doch bewerkstelligen kann? Definition File einbinden oder Definition File + Dll in eine *.lib oder *.a konvertieren?!

Grüße,
Pixtar
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

wenn eine dll mit dem vc irgendwas erstellt wurde, kriegst bestimmt keine .a (gcc kompatible version) so ohne weiteres dafuer. Da kannst ziemlich hacken um das hinzubekommen. wenn die .lib ned mitgeliefert wird, wirds auch schwer eine zu erstellen.

um das dynamische laden kommst also ned drumherum. Aber dacht das ist eh das was wolltest ?

mit QLibrary kenn ich mich ned sooo aus, muesst ich selber die doku schauen.

aber, was weisst du von der Dll ?
hasst du nen header von den exportierten funktionen ?
exportiert das ding klassen in der schnittstelle ?
welche aufrufconventionen wurden verwendet ?

ne dll zu laden schlaegt eigentlich nur fehl, wenn das ding kaputt ist, oder abhaengigkeiten nicht aufgeloest werden können .....

versuch mal das ding mit LoadLibrary(WinAPI) zu laden !
geht das, wenn nein, welcher fehlercode ?

dann schau mal im dependency walker, ob das ding ned von irgendwelchen anderen dlls abhaengt.
wenn das ding mit vsc6 erstellt wurden iss, wirst sicher die runtimes vom vc6 bzw kompatible (msvcrt ... und co) brauchen sonst geht gar nichts.

BTW, solltest dich dringends mal mit dll und dem konzept auseinandersetzen. Aber ohne vertsaendnis von der thematik wirst ned weit kommen, wenn es ueber über die automatische dll mechanismen deiner Programmierumgebung hinausgeht.
Grad eben
-Namemergling
-C und Binaerkompatiblitaet
-C++ und die Binaerunkompatiblitaet bei unterschiedlichen kompilern und flags
- Abhaengigkeiten von anderen dlls / runtimes
sind da rudimentaere Dinge, ohne die ned wirklich weit kommen wirst, zumindest mit dem was vorhast ...

Ciao ...
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

Beitrag von Pixtar »

Danke für deine ausführlichen Informationen RHBaum.

Du hattest mit deiner Ansprache der Abhänigkeiten voll ins Schwarze getroffen. Die DLL die ich habe ist alleine nicht lauffähig, sondern hat eine Abhängigkeit zu einer anderen DLL. Tja, der Schlüssel dazu war das oft gepostete Tool DependencyWalker.
Die 2. DLL habe ich nun der 1. DLL beigelegt und QLibrary::load() sowie ::resolve() funktionieren jetzt einwandfrei.

Wenn man nicht selbst an alles denkt .. :wink:

Vielen vielen Dank
Antworten