DLL einbinden
-
Hallo,
ich habe eine fremde DLL (ttdvbacc.dll) die ich in den Borland Builder 6 einbinden möchte.
*.lib (fremde oder selbst erstellt egal kommt immer gleicher Fehler)
*.dll
*.header Datei vorhanden.Die *.lib habe ich dem Project hinzugefügt
unter
Project/Options/Directories unter Conditional defines
WIN32;_DEBUG;_WINDOWS;_AFXDLL;_MBCS;AFX_EXT_CLASS
eintrag gemachtdie Header Datei ist wie folgt aufgebaut
#if !defined(AFX_COMMON_H__0E929338_258F_11D4_B88E_00105A22770E__INCLUDED_) #define AFX_COMMON_H__0E929338_258F_11D4_B88E_00105A22770E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 //--- Common return value type typedef enum { DVB_ERR_NONE, // kein Fehler DVB_ERR_DRIVER, // Treiberzugriffsfehler DVB_ERR_HARDWARE, // Hardware-Fehler DVB_ERR_PARAMETER, // ungültiger Parameter DVB_ERR_TIMEOUT, // Timeout DVB_ERR_STATE, // Zustandsfehler DVB_ERR_RESOURCES, // Mangel an Ressourcen DVB_ERR_GENERAL // allgemeiner Fehler } DVB_ERROR; //__declspec(dllimport) // class AFX_EXT_CLASS CDVBCommon //class CDVBCommon { public: //--- Device-Driver open and close -------------------- static WORD GetNumberOfDevices(void); //static BOOL GetDeviceInfo(WORD wDevIdx, CString& Name, CString& MAC, CString& IP); static BOOL OpenDevice(WORD wDevIdx, LPCTSTR AppName = NULL, BOOL NoNetwork = FALSE);usw.............
Beim Aufruf
WORD wDevIdx = 0; if(! CDVBCommon::OpenDevice(wDevIdx)) { } oder int anz = CDVBCommon::GetNumberOfDevices();kommt immer die Fehlermeldung:
[Linker Error] Unresolved external 'CDVBCommon::OpenDevice(unsigned short, const char *, int)' referenced from UNIT1.OBJ
[Linker Error] Unresolved external 'CDVBCommon::GetNumberOfDevices()' referenced from UNIT1.OBJ
Wer kann helfen?
Vielen Dank
-
Hallo zorro888,
so weit ich das vom Builder 5 weiß sollte man die *.LIB auch in der Projektverwaltung mit aufnehmen und nicht nur in "Project/Options/Directories".Gruß
Dieter
-
Hallo
Das wird nicht funktionieren. Mit dem Builder-Hilfsprogramm *implib* (näheres : Forumssuche) könntest du eine für den Builder passende LIB generieren lassen. Allerdings geht das nur für DLLs mit einem reinen C-Interface. Deine DLL hat offenbar aber Klassen. Für diese gibt es keine standardisierte Implementation, jeder Compiler verarbeitet solche C++ Features anders. Solange also die DLL selbst nicht mit dem gleichen Compiler kompiliert wurde, mit dem du sie jetzt einbinden willst, kannst du diese nicht verwenden.
bis bald
akari
-
Was ist mit dieser Methode? kann man damit evetuell auf die DLL zugreifen:
h-File// Mit der Funktion LoadLibrary wird ein Handle auf die GeoDLL erzeugt. // Dieses Handle wird benötigt um mit der Funktion GetProcAddress die Adressen // der benötigten Funktionen aus der DLL zu erhalten. HANDLE hDLL; // Handle auf die GEODLL short int sReturn; // Fehler bei der Initialisierung der Zeiger // auf die GEODLL-Funktionen // Zeiger für die DLL-Funktion FREISCHALT setzen short int (_stdcall *pfnFreischalt) (long int); // Zeiger für die DLL-Funktion TRANS setzen short int (_stdcall *pfnTrans) (double, double, short int, short int, short int, double *, double *, short int, short int, short int, short int);cpp-File
// Konstruktor des Objektes TAllgGPS_GEODLL __fastcall TAllgGPS_GEODLL::TAllgGPS_GEODLL(TComponent* Owner) // Eigentümer der Klasse : TAllgGPSsplitStr(Owner) { // Initialisieren eines Teilstrings für einen Wert aus einem GPS-String pcTeilStr = new char[32]; // Initialisieren der Zeiger auf die Funktionen der GEODLL pfnFreischalt = NULL; pfnTrans = NULL; // Adressen der Funktionen aus der GEODLL ermitteln if (pfnTrans == NULL) // Wurde die Adresse bereits gesucht? { // get Handle auf die GEODLL if ((hDLL = LoadLibrary("GEODLL32.DLL")) != NULL) { // Adresse der Freischalt-Funktion if ((pfnFreischalt = (short int (_stdcall *)(long int)) GetProcAddress(hDLL, "freischalt")) == NULL) { sReturn = 0; // Fehler in den Logfile schreiben Fehlertext = "[TAllgGPS_GEODLL::TAllgGPS_GEODLL] Keine Adresse der" " Freischalt-Funktion freischalt."; Log_File->GPS = Fehlertext.c_str (); } else { // Adresse der Umrechnungsfunktion if ((pfnTrans = (short int (_stdcall *)(double, double, short int, short int, short int, double *, double *, short int, short int, short int, short int)) GetProcAddress(hDLL, "trans")) == NULL) { sReturn = 0; // Fehler in den Logfile schreiben Fehlertext = "[TAllgGPS_GEODLL::TAllgGPS_GEODLL] Keine Adresse der" " Umrechnungsfunktion trans."; Log_File->GPS = Fehlertext.c_str (); } } } else { // Fehler beim ermitten des Handle auf die GEODLL sReturn = 0; // Fehler in den Logfile schreiben Fehlertext = "[TAllgGPS_GEODLL::TAllgGPS_GEODLL] Kein Handle auf die " "DLL GEODLL32.DLL."; Log_File->GPS = Fehlertext.c_str (); } } } // AUFRUF der DLL-Funktion // // Umrechnen der Koordinate von WGS84 in UTM (Bezugselipsoid WGS84) sReturn = pfnTrans(lon_e, lat_n, sKoordSysQ, sBezSysQ, sNotationQ, dKoordXZ, dKoordYZ, sKoordSysZ, sBezSysZ, sNotationZ, sStreifenZ);Gruß
Dieter
-
Klick mal im Borland Builder auf:
Projekt -> Dem Projekt hinzufügen
Und da füg einfach mal die DLL und die LIB Datei ein. Und dann schau mal ob es funktioiert.
-
Hallo
So richtig blicke ich durch den von dir gezeigten Ausschnitt nicht durch. Wenn deine DLL zusätzlich noch ein C-Interface anbietet, kannst du das natürlich benutzen, egal ob die DLL intern mit Klassen arbeitet oder nicht. Das C-Interface solltest du auch statisch einbinden können, ohne selber mit LoadLibrary arbeiten zu müßen.
bis bald
akari