Ich versuche, eine hypothetische Plugin mit dem folgenden Header zu laden:Warum kann ich eine C++ statische Klassen-Factory-Methode in einer DLL mit GetProcAddress nicht aufrufen?
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
class DLLIMPORT DllClass
{
public:
virtual ~DllClass(void);
static DllClass* getPCFilter();
virtual int Process(int a, int b);
protected:
DllClass();
};
#endif /* _DLL_H_ */
Und mein Host Code tut:
HINSTANCE hinstDLL;
hinstDLL = LoadLibrary(L"PCFilter.dll");
if(hinstDLL)
{
typedef DllClass*(*Factory)();
Factory fun1;
fun1 = (Factory)GetProcAddress(hinstDLL, "DllClass::getPCFilter");
Die dll öffnet aber die GetProcAddress ist nicht die statische Factory-Methode zu finden. Soll ich das nicht so machen können?
Ich habe versucht, immer von der statischen Methode zu befreien und stattdessen nach der Klassendeklaration, die folgenden Aktionen ausführen:
extern "C" DLLIMPORT void* getPCFilterInstance()
{
return (void*)new DllClass();
}
Aber dann, wenn die Host-Quelle kompilieren, der Linker klagt:
In function `getPCFilterInstance'::
[Linker Error] undefined reference to `_imp___ZN8DllClassC1Ev'
Das kann ich lösen, indem ich auf die .a lib verlinke. Aber ist es nicht die Idee der DLL, nicht zur Kompilierzeit verlinken zu müssen?
mit vielleicht ein 'extern„C“' Funktion sollte Hilfe. –
Der Funktionsname ist nicht "DLLClass :: getPCFilter". Schauen Sie sich die Export-Tabelle der DLL an. –