Linker fehler Mehrdeutige Symbole in der Def
-
hallo,
CKernelD.def
LIBRARY "CKernelD" EXPORTS ; Explizite Exporte können hier eingefügt werden GetIniPath @2
CKernel.h
#ifdef __cplusplus extern "C" { #endif /* __cplusplus */ class CRegD { protected: CRegD(); ~CRegD(); public: ... static void __declspec(dllexport) GetIniFile(void* pObject, CString& sIniFile); ... }; #ifdef __cplusplus } #endif
der linker meldet mir u.a. LNK:4002 kann keinen eindeutigen übereinstimmung für symbol 'GetIniPath' finden.
logisch-> er sieht auch __stdcall CDaoWorkspace::GetIniPath(); in mfcs70d.lib
wie kann ich diese funktion ausblenden; aber mfcs70d.lib brauch mein project.
volker
-
Ich finde in deinem Code KEINE Funktion GetIniPath
-
@rene
doch hab das falsche gelöscht
static void __declspec(dllexport) GetIniFile(void* pObject, CString& sIniFile); static void __declspec(dllexport) GetIniPath(CString& sIniPath);
-
Wozu brauchst Du 2 Exporttabellen, 1. als Name und 2. als Integer?
-
Original erstellt von RenéG:
Wozu brauchst Du 2 Exporttabellen, 1. als Name und 2. als Integer????
ich will eigendlich nur die function GetIniPath exportieren.
LIBRARY "CKernelD" EXPORTS GetIniPath ; Explizite Exporte können hier eingefügt werden
leider kann der linker das symbol(func) nicht eindeutig zuordnen, da er diese
auch in _stdcall CDaoWorkspace::GetIniPath() (mfcs70d.lib) findet.wenn ich GetIniPath nicht exportieren, kann ich die function wie folgt nicht aufrufen;
... if (HINSTANCE hInst=LoadLibrary("CKernelD.dll")) { if (pGetIniPath pFunc=(pGetIniPath)GetProcAddress(hInst, "GetIniPath")) { pFunc(tReg.pObject, m_sFile); } #ifdef _DEBUG else ASSERT(0); #endif FreeLibrary(hInst); } ...
die CKernelD.lib kann ich in den oberen code nicht einbinden, da sonst die beiden dll (bei der erstellen gegenseitig abhängig werden)
volker
[ Dieser Beitrag wurde am 16.04.2003 um 14:05 Uhr von vdittrich editiert. ]
-
__declspec(dllexport) exportiert doch Deinen Namen schon, so dass Du ihn per GetProcAddress ermitteln kannst!
-
Deine Funktion sollte nicht innerhalb der Klasse stehen, da hier ein von C++ dekorierter Name erstellt wird, der zusätzlich aus dem Klassennamen besteht. Damit funzt dann GetProcAddress nicht mehr. Ausser natürlich, du kennst den dekorierten Namen. Dieser steht übrigens in der Export-Tabelle der generierten DLL !
-
das dumme ist eben nicht ???
#pragma once #include "../CMsgDll/Resource.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef enum vStateDB { VDB_OPEN = IDS_DB_OPEN, VDB_NEW = IDS_DB_NEW, VDB_RECONNECT = IDS_DB_RECONNECT, VDB_OPEN_AFTER = IDS_DB_OPEN_AFTER_RECONNECT, VDB_ERROR = IDS_DB_ERROR, VDB_CLOSE = IDS_DB_CLOSE, VDB_CLOSED = IDS_DB_CLOSED, }; struct rRegWnd; //foward deklaration typedef void (*pStateDB)(void* pOb, vStateDB); typedef void (*pGetIniPath)(void* pObject, CString& sIniFile); struct rRegWnd { void* pObject; HWND hwnd; pStateDB _StateDB; CString sINI; }; #pragma warning(disable:4190) typedef rRegWnd (*pGetReg) (void* pObject); class CRegDEx; // wird vererbt in class CRegDEx: public CRegD class CRegD { protected: CRegD(); ~CRegD(); public: static pGetReg __declspec(dllexport) AddReg(rRegWnd& tRegWnd); static bool __declspec(dllexport) DelReg(void* pObject); // ret true -> close hWnd self static void __declspec(dllexport) GetIniPath(void* pObject, CString& sIniFile); static vStateDB __declspec(dllexport) GetDBState(void); private: static rRegWnd _pGetReg(void* pObject); protected: ... }; #pragma warning(default:4190) #ifdef __cplusplus } #endif
-
das dumme ist eben nicht ???
Worauf beziehst du das jetzt?
-
Original erstellt von RenéG:
**[quote]
das dumme ist eben nicht ???
****
Worauf beziehst du das jetzt?**[/QUOTE]->> _declspec(dllexport) exportiert doch Deinen Namen schon, so dass Du ihn per GetProcAddress ermitteln kannst!
Deine Funktion sollte nicht innerhalb der Klasse stehen, da hier ein von C++ dekorierter Name erstellt wird, der zusätzlich aus dem Klassennamen besteht. Damit funzt dann GetProcAddress nicht mehr. Ausser natürlich, du kennst den dekorierten Namen. Dieser steht übrigens in der Export-Tabelle der generierten DLL !
könnte so was in der art sein __imp_?AddReg@CRegD
aber man kann den guten stück ja auch einen anderen namen geben wie GetIniPathEx().
aber mit der
innerhalb der Klasse ...
muß ich mir merken, ist eigendlich logisch.
danke für deine hilfe volker