c ++& python在不同的dll中关闭和打开文件

时间:2016-05-12 11:34:23

标签: python c++ dll ctypes

情况很简单。我在一个DLL(DLL1)中打开文件,然后在另一个DLL(DLL2)中关闭它。我在python脚本中一个接一个地调用这两个DLL,代码如下:

from ctypes import *

DLLFP1=r"C:\Workspaces\CPP\Test\build\files1.dll"
DLLFP2=r"C:\Workspaces\CPP\Test\build\files2.dll"
DLL1=cdll.LoadLibrary(DLLFP1)
DLL2=cdll.LoadLibrary(DLLFP2)

cppobj=c_void_p()
DLL1.open( byref(cppobj) )

DLL2.close(cppobj)

DLL1代码:

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT void open(ofstream* &f){
  f = new ofstream();
  string FP("c:\\teest.log");
  f->open(FP);
}

和DLL2代码:

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT void close(ofstream* f){
  f->close();
}

在结果中我有#34;访问违规写作"。我也可以正常地从DLL2写文件到文件,如果我将关闭函数移动到DLL1,它工作正常。我用的是intel编译器。操作系统是Windows7。

问题是什么问题?在DLL之间共享文件的正确方法是什么?

非常感谢您提前。

1 个答案:

答案 0 :(得分:0)

除非为同一运行时构建 DLL1 DLL2 ,否则这可能是相关的:Potential Errors Passing CRT Objects Across DLL Boundaries

  

当您传递C运行时(CRT)对象(如文件句柄,语言环境)时,   和环境变量进入或退出DLL(函数调用   DLL边界),如果DLL也可能发生意外行为   作为调用DLL的文件,使用CRT的不同副本   库。