使用静态指针创建一个类,以显式加载DLL函数

时间:2010-07-18 02:28:47

标签: c++ dll dllexport

我想拥有DLLInterface类的多个实例,但是因为每个对象都有指向相同DLL函数的指针,所以我希望它们是静态的。

以下代码无法编译。 (我确实有理由需要包含相同指针的多个实例,下面的精简代码没有说明。)

//Header file:

typedef void (*DLLFunction)();
class DLLInterface
{
private:
    static HINSTANCE hinstDLL;
public:
    static DLLFunction Do;

    DLLInterface()
    {
        if(!hinstDLL || !Do)
        {
            hinstDLL = LoadLibrary("DoubleThink.dll");
            Do = (DLLFunction)GetProcAddress(hinstDLL, "Do");
        }
    }
};

我还需要在此头文件中包含所有代码。 (我知道我可以通过在EXE上的cpp文件中添加如下语句来编译它,但我需要避免这样做。

  

HINSTANCE DLLInterface :: hinstDLL = 0;

谢谢!

1 个答案:

答案 0 :(得分:1)

我能想到的一个技巧是使用模板。我们的想法是让类包含静态数据一个模板类,然后从中派生出具有某种特定类型的实际类:

template <class T>
class DLLInterfaceImpl;
{
private:
    static HINSTANCE hinstDLL;
public:
    static DLLFunction Do;
};

template <class T>
HINSTANCE DllInterfaceImpl<T>::hInstDLL;

template <class T>
DLLFunction DllInterfaceImpl<T>::Do;

class DllInterface : public DllInterfaceImpl<int>
{
};

因为DllInterfaceImpl是一个模板,你可以将静态定义放在头文件中,编译器会做一些“技巧”,这样多个定义就不会导致链接失败。