通過可變參數(shù)模板 可以不定參數(shù)地調(diào)用庫函數(shù)
TIPS:如果是類成員模板函數(shù),采用在頭文件聲明火鼻,在源文件定義的方式可能會出現(xiàn)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可以為不同類型參數(shù)
int result = call<int>("xxx.dll", "xxx", params1, params2, params3, ...)
}
catch()
{
...
}
}
甚至如果庫中函數(shù)返回值為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可以為不同類型參數(shù)
//可以不指定返回值
int result = call("xxx.dll", "xxx", params1, params2, params3, ...)
}
catch()
{
...
}
}