使C函数指针与C++中基于C样式堆栈的调用机制一起工作
Making a C function pointer work with C-style stack based calling mechanics in C++
我想从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
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- 是否可以检查悬挂光纤的调用堆栈?
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- 了解使用堆栈实现队列的递归调用机制
- C++析构函数调用两次,堆栈分配的复合对象
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- C/C++中全局调用堆栈的基础
- 是否可以访问代码中的调用堆栈?
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 调用堆栈显示 SIGBUS,这意味着什么
- 堆栈展开如何与析构函数调用有关?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 将参数推送到调用堆栈 (C++) 的可移植方法
- 从基类堆栈调用派生类实例
- 堆栈调用析构函数,即使遵循三规则
- 用于生成函数以从运行时堆栈调用带参数的函数的模板