Почему я не могу вызвать фабричный метод статического класса C++ в DLL с помощью GetProcAddress?

Я пытаюсь загрузить гипотетический подключаемый модуль со следующим заголовком:

#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 не должна компоноваться во время компиляции?

0
задан SaldaVonSchwartz 9 April 2012 в 13:19
поделиться