Создание класса со статическими указателями на явно загруженные функции DLL - PullRequest
1 голос
/ 18 июля 2010

Я хочу иметь несколько экземпляров класса 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");
        }
    }
};

Мне также нужен весь код, содержащийся в этом заголовочном файле.(Я знаю, что могу заставить его скомпилировать, добавив операторы, подобные следующим, в файл cpp на EXE, но мне нужно избегать этого.

HINSTANCE DLLInterface :: hinstDLL = 0;

Спасибо!

1 Ответ

1 голос
/ 18 июля 2010

Я могу придумать один прием - использовать шаблоны. Идея состоит в том, чтобы сделать класс включающим статические данные классом шаблона, а затем извлечь из него фактический класс с определенным типом:

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 является шаблоном, вы можете поместить свои статические определения в заголовочный файл, и компилятор выполнит некоторые «трюки», чтобы множественные определения не приводили к сбою ссылки.

...