C ++ класс, чтобы обернуть loadlibrary? - PullRequest
6 голосов
/ 04 ноября 2011

Я думал, что было бы здорово иметь несколько классов, чтобы обернуть вокруг LoadLibrary и GetProcAddress, Library и Function соответственно.Пока я думал об этом, я не уверен, что это возможно.Вот что я думаю:

Library класс:

class Library
{
    HANDLE m_handle;
public:
    // Handles initializing the DLL:
    Library(std::string name);
    // Deinitializes the DLL
    ~Library();

    HANDLE getHandle();
    bool isInitialized();
}

И класс Function:

class Function
{
public:
    Function(Library& library, std::string name);


    void* call(/* varg arguments? */) throw(exception);

    bool isValid();
}

Проблема возникает из-за того, что я должениметь динамические типы данных для параметров и несколько длин для передачи в указатель реальной функции.Я мог бы обойти несколько длин аргументов, указав их в конструкторе и имея конкретные методы, но как насчет типов данных?

РЕДАКТИРОВАТЬ: я создал классы на основе ответов для любого, чтобы использовать здесь:https://github.com/ic3man5/ice--

Ответы [ 2 ]

9 голосов
/ 04 ноября 2011

Вы можете реализовать неявное преобразование в указатель на функцию.

template <typename Signature>
struct Function
{
    Function(Library& library, std::string name)
    {
        m_func = reinterpret_cast<Signature *>(
            ::GetProcAddress(library.m_hModule, name.c_str()));
    }
    operator Signature *() { return m_func; }
private:
    Signature * m_func;
};

Использовать класс следующим образом:

Function<int (int, double)> foo(library, "foo");
int i = foo(42, 2.0);
1 голос
/ 04 ноября 2011

Для вдохновения вы можете заглянуть в QPluginLoader Qt & QLibrary .

Что касается вызова динамически загружаемых функций с произвольной сигнатурой, вы можете использовать LibFFI

Все это с точки зрения Linux, я не знаю Windows и не знаю там эквивалента (но оба Qt и LibFFI перенесены на Windows)

Замечаниечто вызов произвольной функции через указатель может зависеть от компилятора, процессора и ABI (следовательно, libFFI содержит непереносимый код).

...