C ++/ATLプロジェクトの32ビットバージョンをに登録しようとすると
regsvr32 project.dll
このエラーが発生します:
LoadLibrary("project.dll") failed - The specified module could not be found
project.dllは、VisualStudio10でATLを使用して構築された私のdllです。
64ビットバージョンは正常に登録されました。
私は何が欠けていますか?
これとまったく同じエラーが発生しましたが、解決策は再配布可能ファイルをインストールしていませんでした。依存するDLLはすべて、depends.exeによるとシステム1に存在していました。
私の場合、KERNEL32.DLLのアイコンは少し赤みがかっていました。Depends.exeは多くの説明を提供しませんでしたが、調べてみると、インポートされた関数の1つがシステムのDLLから欠落していることがわかりました。インポートされた関数を表示するには、ツリービューで依存するDLLを選択し、右側のパネルでインポートを探します。PI列で並べ替えると、不足しているインポートの赤いアイコンが表示されます。
私の場合、不足している機能は、私の悲しいターゲットオペレーティングシステムであるWindowsXPには存在しなかった機能でした。私のプログラムはこの関数に直接依存していなかったので#define
、プロジェクトで次のことを回避することができました。
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
これらのマクロをコンパイルすると、問題の関数がヘッダーで宣言されなかったため、ロード時にインポートされませんでした。今、私は使用することができましたregsvr32
。もちろん、これは非常に特殊な(そして幸運な)ケースです。そのインポートやその他の新しいAPIに依存していなかったため、プロジェクトのリターゲットを回避できました。システムDLLでなければ、依存関係グラフのサブツリー全体を更新する必要が生じる可能性のある新しいバージョンを見つける必要がありました。さらに悪いことに、不足しているインポートに依存している場合は、深刻なリファクタリングが必要になります。
要約すると、このエラーメッセージ2は、次の問題が原因で発生する可能性があります。
1 .:IESHIMS.DLLとWER.DLLは別として、この古いツールのバグと思われます。
2 .:または、実際には、特定のシステムにDLLをロードする際の問題
この場合、エラーの説明は誤解を招く可能性があります。システムはDLL(project.dll)を検出しますが、DLLの1つ(または複数)の依存関係が欠落している可能性があります。
インストールしました
Microsoft Visual C++ 2010 Redistributable Package
これで、dllをインストールできます。
これは機能しますが、dllをクライアントで機能させるためにこのパッケージをクライアントにインストールする必要がないため、これにはあまり満足していません。