2016-05-12 140 views
2

情况很简单。我在一个DLL(DLL1)中打开文件并在另一个(DLL2)中关闭它。我调用陆续在python脚本两个DLL文件之一,它的代码如下:C++&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(); 
} 

在结果我有“访问违规写作”。我也可以正常写入文件从DLL2文件,如果我移动关闭功能DLL1它工作正常。我使用英特尔编译器。操作系统是Windows7。

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

非常感谢您提前。

+0

相关:[C++ 11地址是否考虑在动态/共享库边界之间传递std库对象?](http://programmers.stackexchange.com/questions/176681/did-c11-address-concerns-通过std-lib-objects-between-dynamic-shared-librar) – robyschek

+0

尝试将两个dll与动态C运行时连接,用MS的cl.exe它是'/ MD'开关 – robyschek

+0

我试过了,不幸的是,帮助。 –

回答

0

这可能与除非DLL1DLL 2是专门为同一运行时:Potential Errors Passing CRT Objects Across DLL Boundaries

当你通过C运行时(CRT)对象,如文件句柄,语言环境, 和环境变量进入或退出DLL(跨越 DLL边界的函数调用),如果DLL以及调用DLL的文件使用不同的CRT 库,则会发生意外的行为。

相关问题