在python上通过ctypes调用导出的c ++函数时,我遇到了访问冲突。
我将问题缩小到以下c ++函数:(在vs2017上编译)
fstream
调用该函数时,我收到以下错误(与vs调试时显示的错误相同):
Python代码:
#include <cstdio>
__declspec(dllexport) void x()
{
FILE* out = stdout; // After debugging, this is where the access violation happens.
}
错误:
OSError:异常:写入0x_some_address的访问冲突
关键因素是,上面编译为EXE。
(当我导出一个调用'main'入口点的函数时,整个事情就开始了)
花了一些时间在这上面并尝试了所有内容后,我尝试将上面的内容编译为DLL,现在它正在按预期工作。
所以问题是,有人可以向我解释导致问题的原因吗?
我(或多或少)知道内存管理的差异,但不知道细节。
感谢。
答案 0 :(得分:2)
本文似乎为此提供了足够的背景信息和可能的解决方案: https://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible
主要区别是加载EXE作为DLL:
- 未初始化CRT,包括任何全局变量和
- 导入地址表未正确配置,这意味着对导入函数的所有调用都将崩溃。