次のヘッダーを持つ架空のプラグインをロードしようとしています:
#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 のアイデアではないでしょうか。