0

私のコードは、静的/暗黙的にリンクされた DLL (DLLB と呼びましょう) であるライブラリを使用していますが、実行時にそれを見つけることができません。

これは、DLLB を呼び出し元のコードと同じディレクトリに配置しているにもかかわらずです。(呼び出しコード自体は、Python から呼び出される DLL、DLLA であり、arcpy から呼び出されます。同じディレクトリにあるにもかかわらず、Python が DLLA を正常に検出するのに、DLLA が DLLB を検出しない理由がよくわかりません) .

ライブラリ DLL をシステム パスのどこかに配置すると、すべて正常に動作します。

しかし、展開に最適なアプローチは何ですか? インストール時に、クライアント マシンのシステム パスにエントリを追加しますか? DLL をロードする前に、実行時に Python からシステム パスを変更しますか? 他の何か?

4

1 に答える 1

3

Python は、 LoadLibrary呼び出しで DLL へのフル パスを指定する必要があります。これは推奨される方法です。モジュール名のみを指定すると、間違った DLL が読み込まれる危険性があり、バイナリ プランティングの脆弱性が発生する可能性があります。

デフォルトの検索パスには、実行可能ファイルがロードされたディレクトリが含まれますが、他の DLL がロードされたディレクトリは含まれないことに注意してください。したがって、表示されている動作は期待どおりです。

動的読み込みを使用できる場合は、DLLA へのパスを検索し、それを使用して DLLB へのパスを構築できます。

DLLA のモジュール ハンドルを取得するには、GetModuleHandleExを呼び出します。モジュール ハンドルから DLLA への完全なパスを取得するには、GetModuleFileNameを呼び出します。最後の要素が DLLA.dll であることを確認し、DLLB.dll に置き換えます。その後、LoadLibrary を呼び出すことができます。

于 2012-10-14T21:41:25.520 に答える