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 gemacht

    die 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


Anmelden zum Antworten