0

次のヘッダーを持つ架空のプラグインをロードしようとしています:

#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 のアイデアではないでしょうか。

4

2 に答える 2