0

基本的に、私たちのソフトウェアが の下で実行されるときWindows 7、それは機能します: への呼び出しがLoadLibrary()成功し、人生は良いものになります。

しかし、同じソフトウェアがXPボックス (最新のパッチ) で実行されている場合、 の呼び出しは失敗し、を指定するエラー コードで がLoadLibrary返されます。 NULLmodule not found

アプリ のバージョンではなくUNICODEバージョンを使用するように強制しようとしました。LoadLibraryWLoadLibraryA

インストール フォルダーがローカル ドライブ文字を介してマップされていることを確認してみました。

そして、パス名が実際に実行中のマシンからアクセスできることを確認しました (つまり、生成されたエラーは、ロードしようとしているパスを示し、その文字列を使用して実際にファイルを見つけます)。

奇妙なことに、このコードは でコンパイルすると正しく実行されVS 2008 SP2ます。

クライアント マシンが の場合も問題なく動作しますWindows 7

VS 2010コンパイルされてリンクされ、クライアントで実行された場合にのみ失敗しXPます。

世界で何がうまくいかないのか、私は完全に途方に暮れています。

シチューに奇妙さを加えるには:

開発ボックスを起動し、このコードを の下XP VMのデバッグ ビルドで実行すると、正しく動作します。 VS2010XP

実際、私の の下ではXP VM、標準 (リリース) ビルドも正しく実行されます!!!

失敗するのは、真のXPボックスから実行したときだけです(これまでにいくつかのマシンを試しましたがXP、両方とも完全にパッチが適用されています)。

何かご意見は?!
私は信頼できるアイデアを使い果たし始めています。:(

4

3 に答える 3

2

パス名にアクセスできることを確認したとのことですが、それが機能するかどうかを確認するために、dllのディレクトリをPATH環境変数に追加してみましたか?そうすれば、問題を特定してそこから解決しようとして失敗していることを確認できます。

私は最近、自分のプロジェクトでこの問題を経験しました。LoadLibraryAへの完全なファイルパスを指定しようとすると、そのエラーコードが返されました。問題は、ロードしているDLLの依存DLLを見つけようとするLoadLibraryの検索パスの問題でした。したがって、おそらくリソースDLLには、LoadLibraryがアクセスする方法を知らないDLLもいくつかあります。

于 2011-01-28T18:48:54.613 に答える
2

ツールセットとプラットフォームの組み合わせの違いを調べます。

たとえば、VS2008 と VS2010 の違いは、使用している SDK ほど重要ではありません。さまざまな SDK がさまざまな msvc ランタイム ライブラリをターゲットにしている可能性があります。

VS2010 ランタイム ライブラリが XP VM にインストールされていて、他の XP プラットフォームにはインストールされていない可能性はありますか?

動作していないプラットフォームで「depends」ユーティリティを試して、不足している依存関係を特定することもできます。

于 2011-01-28T19:00:42.453 に答える
1

もう 1 つの一般的な問題は、「b.dll」に依存する「a.dll」をロードする場合です。「b.dll」に問題がある場合、「a.dll」を読み込めないことを示すエラーが発生することがあります。これは本当ですが、役に立ちません。

dll の依存関係を表示できるアプリケーションがいくつかあります。

于 2011-01-28T19:26:36.603 に答える