使C函数指针与C++中基于C样式堆栈的调用机制一起工作

Making a C function pointer work with C-style stack based calling mechanics in C++

本文关键字:堆栈 调用 一起 工作 样式 机制 指针 函数 C++      更新时间:2023-10-16

我想从C++程序中的dll调用一个纯C风格的函数。我尝试使用reinterpret_cast将函数指针强制转换为__cdecl,但似乎仍然保留了_stdcall的调用约定。我是Windows C++编程的新手。

编辑注释中的代码

reinterpret_cast< Error ( __cdecl*)(int,int)> (GetProcAddress(Mydll::GetInstance()->ReturnDLLInstance(), "add"))(1,10) 

是我的决定。实际的函数语法似乎已声明为

Error __cdecl add(int,int);

调试器向我抛出错误运行时检查失败#0。我在Windows-C++中工作

我相信你的问题的解决方案是'extern"C"{…'

请参阅http://www.parashift.com/c++-faq-lite/mixin-c-and-cpp.html#faq-32.3

通常需要使用extern"C"来实现。。。

---c_code.h---

void func(int arg);
void (*func_ptr)(int arg);

---cpp_code.cpp---

extern "C" void func(int arg);
extern "C" void (*func_ptr)(int arg);
int main()
{
    func(20);
    *func_ptr(20);
}

这里有两件事在起作用。

第一个是呼叫约定。调用约定是应用程序二进制接口(ABI(的一部分,它决定调用方还是被调用方负责清理堆栈。如果你想让你的函数正确运行,那么你和dll都需要使用相同的调用约定。在WIN32 API中,这通常是__stdcall,尽管C通常使用__cdecl。

另一个问题是名称篡改。由于函数的自变量是C++中函数签名的一部分(为了允许函数重载(,因此这些信息被合并到对象代码的符号表中。这通常是一大堆特别奇怪的角色。C不需要进行名称篡改,因为它不允许函数重载。

有时在C++中,您想要调用C函数(即由C而非C++编译器编译的C函数符号(。在这种情况下,您需要在extern "C" {}块中定义函数。

希望这将帮助您摆脱

这帮了我一把!

http://www.codeguru.com/forum/archive/index.php/t-70673.html