1

我想要一个 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;

谢谢!

4

1 回答 1

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 是一个模板,你可以把你的静态定义放在头文件中,编译器会做一些“技巧”,这样多个定义就不会导致链接失败。

于 2010-07-18T03:02:51.490 回答