情况很简单。我在一个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之间共享文件的正确方法是什么?
非常感谢您提前。
答案 0 :(得分:0)
除非为同一运行时构建 DLL1 和 DLL2 ,否则这可能是相关的:Potential Errors Passing CRT Objects Across DLL Boundaries
当您传递C运行时(CRT)对象(如文件句柄,语言环境)时, 和环境变量进入或退出DLL(函数调用 DLL边界),如果DLL也可能发生意外行为 作为调用DLL的文件,使用CRT的不同副本 库。