包装loadlibrary的C ++类?

时间:2011-11-04 07:16:49

标签: c++ loadlibrary

我认为让几个课程分别包围LoadLibraryGetProcAddressLibraryFunction会很酷。在我考虑这个问题时,我不确定它是否可行。这就是我的想法:

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 个答案:

答案 0 :(得分:9)

您可以实现对函数指针的隐式转换。

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 :(得分:1)

你可以查看Qt的QPluginLoader&amp; QLibrary获得灵感。

关于使用任意签名调用动态加载的函数,您可以使用LibFFI

这一切都是从Linux的角度来看,我不知道Windows和我不知道那里的等价物(但是Qt和LibFFI都被移植到Windows)

请注意,通过指针调用任意函数可以是编译器,处理器和ABI特定的(因此libFFI包含非可移植代码)。