SomeLib.dllWindowsでは、 Python2.7からC++でプログラムされたサードパーティのDLL()を使用して使用しようとしていますctypes。その機能の一部について、このライブラリは別のCOM DLL(SomeCOMlib.dll)を使用し、それ自体が他のDLL(LibA.dll)を使用します。
これは、Pythonから直接COM DLLを使用することではなく、Pythonからそれを使用するDLLを使用することであることに注意してください。
Pythonとの統合を容易にするために、使用したい呼び出しを新しいDLL()の独自の関数にグループ化しました。これもC ++でプログラムされており、より便利な(特定の関数の使用と調整)MyLib.dllからの呼び出しを簡単に行うことができます。シナリオ)。基本的に、私のライブラリは2つの関数を公開しています: 、(すべて戻り、パラメータなし)。ctypesextern "C"doSomethingSimple()doSomethingWithCOMobj()void
「効果的な」依存関係階層は次のとおりです。
MyLib.dll
  SomeLib.dll
    SomeCOMlib.dll
      LibA.dll
MyLib.dllこれらの2つの連続した呼び出しを問題なく使用および実行する単純なC++コンソールアプリケーション(Visual C ++)を作成できます。
Python / ctypesを使用すると、最初の呼び出しは正常に機能しますが、COMを使用する呼び出しは。をスローしWindowsError: [Error -529697949] Windows Error 0xE06D7363ます。ライブラリの残りの動作から、問題はそのCOM呼び出しが行われた場所で正確に発生することがわかります。
LibA.dll(単純なテストC ++アプリケーションも、欠落している場合は同じ場所で多かれ少なかれ失敗しますが、それが関連しているかどうかはわかりません。)
DependencyWalkerを使用して依存関係の階層を確認しました。
SomeCOMlib.dllはSomeLib.dll、明らかに必要ですが、の依存関係としてはリストされていません。また、実行時にも明らかに必要ですが、LibA.dllの依存関係としてはリストされていません。SomeCOMlib.dll
これらのDLLがあるディレクトリ内から、コマンドラインからすべてを実行しています(C ++サンプル実行可能ファイルは正常に動作します)。PATHにそのディレクトリを含めるように強制しようとしました。また、DLLが取得される可能性があると推測したさまざまな場所(C:\Windows\System32およびC:\Python27\DLLs)にDLLをコピーしようとしましたが、成功しませんでした。
SomeCOMlib.dllにも登録されましたregasm.exe。
プレーンC++アプリケーションからこのDLLを使用するctypes場合と、COMメカニズムの独自の使用法(および場合によっては他のDLLのその後のロード)に関してPythonとの違いを引き起こす原因は何ですか?
Windows Error 0xE06D7363問題をさらに調査できるようにするために、Pythonよりも少なくとも少し多くの情報を提供するステップはどれですか?
Pythonコードは次のようになります。
import ctypes
myDll = ctypes.WinDLL("MyLib.dll")
myDll.doSomethingSimple()
myDll.doSomethingWithCOMobj() # This statement throws the Windows Error
(にリンクされた、動作するテストC ++スタンドアロンアプリケーションは、MyLib.dll内でまったく同じ呼び出しを行いますmain。)