2016-05-12 4 views
2

状況は単純です。 1つのDLL(DLL1)でファイルを開き、別のDLL2(DLL2)で閉じます。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(); 
} 

を私が持っている結果でIは、Pythonスクリプトの両方のDLLを次々に起動し、コードは以下の通りであります"アクセス違反書き込み"。私は通常、DLL2からファイルにテキストを書き込むことができますし、DLL1に近い関数を動かすと正常に動作します。私はintelコンパイラを使用します。 OSはWindows7です。

質問は間違っていますか? DLL間でファイルを共有する正しい方法は何ですか?

は事前にありがとうございました。

+0

関連:[C++ 11アドレスは、動的/共有ライブラリの境界の間でstdlibオブジェクトを渡すことについて懸念していましたか?](http://programmers.stackexchange.com/questions/176681/did-c11-address-concerns-ダイナミック共有ライブラリ間のstd-lib-objectsを渡す) – robyschek

+0

ダイナミックCランタイムと2つのdllをリンクするようにしてください。MSのcl.exeは '/ MD 'スイッチ – robyschek

+0

私は試しましたが、残念ながら、助けてください。 –

答えて

0

これはDLL1DLL2ない限り、関連している可能性があり、同じ実行時のために構築されています:あなたがCランタイム(CRT)は、このようなファイルハンドル、ロケール、 としてオブジェクトを渡すとPotential Errors Passing CRT Objects Across DLL Boundaries

と環境変数をDLLの内部または外部に呼び出すと(DLL境界の 関数呼び出し)、DLLが呼び出されるファイルとして と同様に、DLLがCRT ライブラリの異なるコピーを使用すると、予期しない動作が発生することがあります。

関連する問題