class aus DLL von VC++ benutzen
-
Kann mir einer sagen, wie ich eine DLL die von Microsoft VC++ erzeugt wurde, so im BCB (4.0) einbinden muss, dss ich n die Klassen herankomme?
Oder hat einer nen Link zu ner Beshreibung?
Ich hab nur die DLL (und die LIB von VC++)
Mit dem BCB mach ich ne Def- Datei und ne Lib- Datei.
Nehm ich nur die Lib, kommen Fehler "unresolved external ..."
Nehm ich die Def mit auf, mault er über "unzulässige Zeichen"
In der Def- Datei stehen vor den Namen oft zwei Fragezeichen, das scheint zu stören.
-
Dll mit den Dienstprogramm
...\Builder\Bin\coff2omf.exe
umwandeln
-
Eher nicht. coff2omf wandelt libs um.
Erzeuge dir mit implib eine neue lib aus der dll und versuchs mal damit.
Willst du wirklich Klassen importieren? Hast du die notwendigen Header?
-
Das mit ImpLib.exe hab ich ja gemacht
..\Implib.exe LibFile.lib DLLFile.dll
Kommt auch kein Fehler.
Aber die Klassen sind nicht richtig zu sehen.- ich kann Variablen von einer der Klassen anlegen.
- sobald ne memberfunktion gerufen wird, meckert der Linker "unresolved..."Hab auch ne def- Datei mit impdef gemacht.
Da stehen die Namen aber alle mit ?? oder ? vorangestellt drinKlassen MUSS ich importieren. Die DLL ist als Vorgabe da (mit VC++ gemacht)
Die muss ich verwenden.
Header sind auch da, muss ja.
-
Du exportierst die Klasse direkt? Dann geht es nicht. Du musst Hilfsfunktionen exportieren die eine Instanz der Klasse anlegen und zerstören.
-
Exportiert wird alles in der VC++ - DLL die ich bekomme.
Ich muss die importieren.
Die Klassen sieht dr BCB auch. Ich kann ne Variable davon anlegen.
Aber die Memberfunktionen darin bringen einen Linkerfehler.Ich hab mal gelesen, dass ds gehen soll, ich find aber die Seite nicht mehr.
-
Ich habe schon des öfteren gelesen, das das nicht so ohne weiteres geht.
Sieh auch mal hier
http://groups.google.de/group/de.comp.os.ms-windows.programmer...
Der Export über Funktionen ist hier die beste Idee, wobei auch bei den Typen der Parameter aufpassen muß. Es sollte wenn möglich nur PODs bzw. Klassen die nur PODs enthalten sein (keine STL).
-
Mit den Funktionen stimme ich Dir ja zu. Ich mach bei DLLs - wenn ich schon mal eine mach mit BCB - immer nur Funktionen. Dann gehts dynamisch und ev. auch statisch.
Geht aber leider hier nicht:
Die DLL ist ne Vorleistung mit VC++ gemacht die ich verwenden soll. Ich kann die selbst nicht anpassen. Die enthält auch viele Klassen. Da wäre der Umstellaufwand für den VC++- Progger etwas hoch.Das es nicht ohne weiteres geht ist schon klar.
Die Klassen sind auch "nur" C++ - kein MFC oder anderes Zeugs
-
Du könntest ja versuchen eine weitere dll im VC++ zu erzeugen, die dir das notwendige Funktionsinterface liefert, und die dann einbinden (keine Ahnung ob das geht).
Nach dem, was ich bisher so gefunden habe hast du beim direkten Einbinden eher schlechte Karten. Da die Namensauflösung der Funktionen in C++ (insbesondere der Memberfunktionen) nicht genormt ist kann der Linker nur mit viel Glück und einer sehr simplen Schnittstelle die Funktion finden. Sobald in der Parameterliste Klassen (vielleicht sogar STL) auftaucht, ist es vorbei.
-
Ich hab nur die DLL (und die LIB von VC++)
Tja, ich hätte das mit dem Programm probiert
-
Hallo
oder anders gesagt : compiler- oder gar sprachübergreifender DLL-Interfaces sollten im reinem C sein. Manchmal sind sogar erweitere C++ Symbole von Compilern/Linkern des gleichen Herstellers, aber unterschiedlicher Version zueinander imkompatibel.
bis bald
akari
-
Genau.
Ich hatte auch mal den Fehler gemacht von einer Lib aus dem BCB5 eine Variable vom Typ std::string an ein BCB6-Programm zu übergeben. Ergebnis: AccessViolation
-
Danke erstmal für die Antworten.
Es scheint wirklich an den unverträglichen Namens- Eigenheiten der Compiler zu liegen.@Christian211:
...\Builder\Bin\coff2omf.exe
ist bei meinem BCB 4.0 leider nicht dabei.
-
Hallo
um noch ein Beispiel dranzuhängen : Ich hatte mal einen sehr mysteriösen Fehler bei dem Zugriff von einem MinGW-Programm auf eine Builder5-DLL mit reiner C-Schnittstelle. Es wurden bei Ausführung einer DLL-Funktionen mit einem struct-Parameter völlig unbeteiligte Variablen auf nicht nachvollziehbare Werte gesetzt.
Nach einer Stunde Debuggen habe ich dann rausgefunden, das es an dem Typ enum liegt. Der Builder benutzt für enum 1 Byte, MinGW 4 Byte. Das struct hatte natürlich enums...
Habe die enums durch ints ersetzt und nur für die Definition der konstanten Werte die enums genommen (sprich die enums über ints-casts durch die Schnittstelle). Dann lief alles wie gewollt.bis bald
akari
-
Ja das Ding mit den Enums kenn ich auch schon.
Seitdem nehm ich auch nur noch ints an den Stellen.Frank