创建一个类作为 dll 的包装器,其中类的公共成员函数只不过是指向通过 get proc address 获得的 dll 中的函数的指针,这将是从 dll 加载函数的一种好方法。
最好使用 c++ 的 RAII 能力来释放通过释放类的析构函数中的库来加载的库。
这个:
typedef int(WINAPI *ShellAboutProc)(HWND, LPCSTR, LPCSTR, HICON);
int main() {
HMODULE hModule = LoadLibrary(TEXT("Shell32.dll"));
ShellAboutProc shellAbout =
(ShellAboutProc)GetProcAddress(hModule, "ShellAboutA");
shellAbout(NULL, "hello", "world", NULL);
FreeLibrary(hModule);
}
可以这样实现:
class ShellApi {
DllHelper _dll{"Shell32.dll"};
public:
decltype(ShellAboutA) *shellAbout = _dll["ShellAboutA"];
};
int main() {
ShellApi shellApi;
shellApi.shellAbout(NULL, "hello", "world", NULL);
}
DllHelper 类在哪里:
class ProcPtr {
public:
explicit ProcPtr(FARPROC ptr) : _ptr(ptr) {}
template <typename T, typename = std::enable_if_t<std::is_function_v<T>>>
operator T *() const {
return reinterpret_cast<T *>(_ptr);
}
private:
FARPROC _ptr;
};
class DllHelper {
public:
explicit DllHelper(LPCTSTR filename) : _module(LoadLibrary(filename)) {}
~DllHelper() { FreeLibrary(_module); }
ProcPtr operator[](LPCSTR proc_name) const {
return ProcPtr(GetProcAddress(_module, proc_name));
}
static HMODULE _parent_module;
private:
HMODULE _module;
};
Benoit的所有学分
我找不到比这更优雅的方式了。