我认为让几个课程分别包围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--
答案 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包含非可移植代码)。