我正在建立一个C ++库,它由python通过ctypes调用。该函数具有指向结构的指针作为参数,并将其传递给其他(内部)函数。它看起来像这样:
extern "C" __declspec(dllexport) void USBEndpoint_subscribe(USBEndpoint* endpoint, CALLBACK callback) {
try {
subscribe_internal(endpoint, callback);
} catch (int e_code) {
exception_report(__FILE__, __LINE__, e_code); \
} catch (...) {
exception_report(__FILE__, __LINE__);
}
void subscribe_internal(USBEndpoint* endpoint, CALLBACK callback)
{
...
}
问题是USBEndpoint_subscribe收到的端点值与进入subscribe_internal的值不同。例如:
调试时我可以看到USBEndpoint_subscribe收到: endpoint = 0x00000000088f0680(和callback = 0x0000000000540f50)
一旦我进入subscribe_internal,在subscribe_internal里面的值是: endpoint = 0x000007fef15f7740(和callback = 0x0000000000000000)。
我没有产生其他线程,我在发布模式下编译库**。我唯一的怀疑可能是堆栈损坏,但实际上我已经知道发生了什么。
非常欢迎任何有关可能发生的事情的提示。
**我已经在调试模式下编译了python,但是设置蜘蛛的速度很慢,如果我使用我的调试编译版本,我会松开交互式控制台,所以我更喜欢坚持发布python并编译我的图书馆在发布。
编辑:
正如所建议的那样,我使用我的调试版python和库的调试编译。但我仍然有相同的行为(端点:0x0000000002be80e0-> 0x0000000000000000,回调:0x0000000000320f88-> 0x00000000024d24b8)。此处没有其他有用的信息显示在发布模式中。
答案 0 :(得分:0)
我正在使用CDLL(“path”)加载库,这使得调用约定为cdecl。即使我在VS2008中使用/ Gd进行编译,它似乎也在使用其他约定。将__cdecl附加到函数声明可以解决问题。