2017-08-26 86 views
0

当python通过ctypes调用导出的C++函数时,我得到访问冲突。访问.exe导出函数时Python ctypes访问冲突

我将问题范围缩小到下面的C++函数:(上vs2017编译)

#include <cstdio> 
__declspec(dllexport) void x() 
{ 
    FILE* out = stdout; // After debugging, this is where the access violation happens. 
} 

当调用我得到以下错误的功能(即显示了VS调试时同样的错误):

Python代码:

ctypes.windll.<exe_name>.x() 

错误:

OSError: exception: access violation writing 0x_some_address

关键因素是,上述内容被编译为EXE。
(整个事情开始时,我出口调用“主”入口点函数)

花费一些这方面的时间和努力的一切,我试图编译上面的DLL之后,现在它的工作如预期。

所以问题是,有人可以向我解释是什么导致了这个问题?
我知道(或多或少)的内存管理差异,但不是细节。

谢谢。

+0

你是说你试图用'ctypes'调用'.exe'?请显示您的Python代码发生错误。还请显示函数的输出以及调用'main'的函数代码。 – cdarke

+0

增加了py代码。 显示功能的导出。这是vs,所以dllexport是将它添加到vtable的。 调用main的函数是无关紧要的。我提出的问题是一个简洁的方式,所有需要的信息重现结果在这里。我只是提到它的背景。 –

+0

'dllexport'与vtable无关。 vtable是用于支持虚函数的特定于C++的设备,它由VS之外的其他实现使用。 'dllexport'将函数名称存储在DLL的导出表中,是Windows特有的,并且也在C程序中使用。在DLL中,你有'DllMain()'函数吗? – cdarke

回答

1

这篇文章似乎给足够的背景信息,并就此问题可能的解决方案: https://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible

的主要区别是加载一个EXE的DLL是:

  • The CRT is not initialized, including any global variables, and
  • The Import Address Table is not correctly configured, which means that all calls to imported functions will crash.
+0

换句话说,将它构建为DLL:^) –

+0

这个问题已经指出了。我知道解决方案是什么,但我要求解释差异。 –

+0

我看到了,我只是评论它的工作复杂性。 –