gpt4 book ai didi

c++ - 为 __stdcall 函数指针提供比预期更多的参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:00 24 4
gpt4 key购买 nike

我正在从供应商提供的 dll(所有 __stdcall)中导入大约 1500 个函数。由于繁琐的原因,dll 存在多个版本,其中包含完整功能列表的各个子集(尽管所有存在的功能都具有通用接口(interface))。所有函数都返回一个指示错误代码的 UINT,但采用不同数量的不同类型的参数。目前,如果 GetProcAddress 失败(因为特定的 dll 版本中不存在相关函数),则函数指针为 left = nullptr,每次客户端从 dll 调用函数时都需要检查它。相反,我想分配一个指向函数的指针,该函数返回一个适当错误代码的 UINT。提议的解决方案遵循以下原则:

UINT missing_func() {
return ERR_MISSING_FUNC;
}
.....
typedef UINT(*LibFuncTy)(int a, const char *b, double c);
.....
//GetProcAddress returned nullptr... set generic function
LibFuncTy LibFunc = reinterpret_cast<LibFunctTy>(missing_func);
.....
//programme tries to call library function
errorval = LibFunc(arg1, arg2, arg3);

此方法按书面方式工作(尽管标准明确未定义)但一旦调用为 __stdcall 就会失败(可能是因为我们弄乱了堆栈)。我看过使用(/滥用)绑定(bind),但似乎对我正在尝试做的事情没有帮助(除非我遗漏了什么)。许多库函数调用都以深层嵌套循环结束,因此我不想在 GetProcAddress 能够找到该函数的情况下招致任何(非常重要的)开销。

是否有一种“正确的”、符合标准的方式来实现这种行为,它可以与 __stdcall 调用约定一起使用,或者我是否必须生成 1500 个不同版本的 missing_func() 以及不同的参数列表,所有这些都返回相同的值(value)?

最佳答案

每个堆栈帧大小都需要一个虚拟函数,因为此约定的 ret 指令会相应地调整堆栈指针。

请注意,“未实现”有一个标准错误代码,我认为符号名称如 E_NOTIMPL 等。检查一下。

关于c++ - 为 __stdcall 函数指针提供比预期更多的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21291915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com