Я пытаюсь загрузить гипотетический подключаемый модуль со следующим заголовком:
#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_ */
И мой хост-код делает это:
HINSTANCE hinstDLL;
hinstDLL = LoadLibrary(L"PCFilter.dll");
if(hinstDLL)
{
typedef DllClass*(*Factory)();
Factory fun1;
fun1 = (Factory)GetProcAddress(hinstDLL, "DllClass::getPCFilter");
dll открывается, но GetProcAddress не находит метод статической фабрики. Разве я не должен быть в состоянии сделать это таким образом?
Я попытался избавиться от статического метода и вместо этого после объявления класса сделал следующее:
extern "C" DLLIMPORT void* getPCFilterInstance()
{
return (void*)new DllClass();
}
Но затем, при компиляции исходного кода хоста, компоновщик жалуется:
In function `getPCFilterInstance'::
[Linker Error] undefined reference to `_imp___ZN8DllClassC1Ev'
Это я могу решить путем компоновки к .a lib. Но разве идея DLL не должна компоноваться во время компиляции?