一种不定参数的库函数调用方法

通过可变参数模板 可以不定参数地调用库函数

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()
  {   
    ...
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容