Kein Klassen-Template aber eine Template-Methode ...
-
Hallo,
Es geht im speziellen um die Methode GetFunctionPtr.
Fehler:
PUmGetUserCount" : Ungültige Verwendung dieses Typs als AusdruckLt. Funktions-Template sollte das so rcihtig sein, nur bin ich mir nicht
sicher ob das auch so für Methoden richtig ist.
Der Fehler hat erstmal ja nix damit zu tun. Ist aber mein aktuelle Problem.Eine Funktion wie:
template< class T > T LoadFunction(HINSTANCE hLib, char* function_name, T* pfn) { *pfn = NULL; if( NULL == (*pfn=(T)GetProcAddress(hLib, function_name)) ) { string strErr; strErr.append("Funktion: "); strErr.append(function_name); strErr.append(" nicht in DLL vorhanden"); throw(strErr); } return *pfn; } funktioniert mit: LoadFunction(m_hLib_Userdata, "UmGetUserCount", &pUmGetUserCount); "komischer" Weise ... obwohl keine weitere spezifikation des Typs angegeben wurde ??? Besten Dank für Eure Hilfe. Grüße RB typedef short (*PUmGetUserCount)(void); void test() { PUmGetUserCount pUmGetUserCount; CDll dll("test.dll"); dll.GetFunctionPtr<PUmGetUserCount>("UmGetUserCount", &pUmGetUserCount); } class CDll { public: CDll(); CDll(string strDllName); virtual ~CDll(); DWORD Load(string strDllName); DWORD Unload(); template<class T > T GetFunctionPtr(const string function_name, T* pfn); protected: HINSTANCE m_hLib; }; CDll::CDll() { HINSTANCE m_hLib = NULL; } CDll::CDll(string strDllName) { Load(strDllName); } CDll::~CDll() { Unload(); } DWORD CDll::Load(string strDllName) { Unload(); SetLastError(0); if( NULL==(m_hLib=LoadLibrary(strDllName.c_str())) ) { strDllName.append(" kann nicht geladen werden"); throw( new CDllException(GetLastError(), strDllName) ); } return GetLastError(); } DWORD CDll::Unload() { SetLastError(0); if( m_hLib ) FreeLibrary(m_hLib); m_hLib = NULL; return GetLastError(); } template<class T > T CDll::GetFunctionPtr(const string function_name, T* pfn) { *pfn = NULL; SetLastError(0); if( NULL == (*pfn=(T)GetProcAddress(m_hLib, function_name)) ) { string strErr; strErr.append("Funktion: "); strErr.append(function_name); strErr.append(" nicht in DLL vorhanden"); throw( new CDllException(GetLastError(), strErr) ); } return *pfn; }<edit>Bitte Code-Tags verwenden!</edit>
-
1. cpp-Tags sind doch einer feine Sache

2. Bei Funktions- und Methodenaufrufen benötigst du die Typangaben nur, wenn du sie nicht implizit aus den Parametern bestimmen kannst
3. In welcher Zeile tritt denn der Fehler auf?