通过可变参数模板 可以不定参数地调用库函数
TIPS:如果是类成员模板函数,采用在头文件声明,在源文件定义的方式可能会出现undefined reference错误,最好将定义也写入头文件中
template <typename RetType, typename... Args>
RetType call(const char *dllName, const char *funcName, Args... args)
{
//加载库
HMODULE hModule = LoadLibraryA(dllName);
if (!hModule)
{
throw std::runtime_error("Failed to load DLL");
}
//获取symbol地址
FARPROC pFunc = GetProcAddress(hModule, funcName);
if (!pFunc)
{
FreeLibrary(hModule);
throw std::runtime_error("Failed to get function address");
}
auto func = reinterpret_cast<RetType (*)(Args...)>(pFunc);
RetType result = func(args...);
FreeLibrary(hModule);
return result;
}
//使用示例
int main()
{
try
{
//params可以为不同类型参数
int result = call<int>("xxx.dll", "xxx", params1, params2, params3, ...)
}
catch()
{
...
}
}
甚至如果库中函数返回值为void 可以简化中括号
template <typename... Args>
//返回值void
void call(const char *dllName, const char *funcName, Args... args)
{
//加载库
HMODULE hModule = LoadLibraryA(dllName);
if (!hModule)
{
throw std::runtime_error("Failed to load DLL");
}
//获取symbol地址
FARPROC pFunc = GetProcAddress(hModule, funcName);
if (!pFunc)
{
FreeLibrary(hModule);
throw std::runtime_error("Failed to get function address");
}
auto func = reinterpret_cast<void(*)(Args...)>(pFunc);
func(args...);
FreeLibrary(hModule);
}
//使用示例
int main()
{
try
{
//params可以为不同类型参数
//可以不指定返回值
int result = call("xxx.dll", "xxx", params1, params2, params3, ...)
}
catch()
{
...
}
}