Visual Studio 2003 .NET から Visual Studio 2010 に変換したプロジェクトがあります。これは .NET プロジェクトではありません。Visual C++ (アンマネージ) です。
DLL は追加の DLL を取り込みます。実行可能ファイルをこの DLL にリンクすると、DLL の初期化中に実行可能ファイルが停止します。(呼び出されている静的オブジェクトのコンストラクターがあり、それらの操作を確認できます。) VS 2010 で作成されたすべての DLL をパスから削除しましたが、そのうちの 1 つを除き、エラーが発生しました。それを VS.NET で作成されたバージョンに置き換えると、プログラムを実行できます。
有益な情報が得られないので、DLL に直接リンクせず、代わりに LoadLibrary を使用してライブラリをロードするテスト アプリケーションを作成することにしました。アイデアは、GetLastError() を使用してライブラリの問題を把握できるようにすることでした。立ち入り禁止; エラー コード -529697949 が表示されますが、これは Windows エラー コードではありません。(DLL を VS.NET で作成したバージョンに変更すると、プログラムは DLL を適切にロードします。)
Dependency Walker (www.dependencywalker.com) を使用して DLL をチェックしたところ、IESHIMS.DLL と WER.DLL が強調表示され、「少なくとも 1 つの遅延読み込み依存モジュールが見つかりませんでした」と表示されました。そのツールで他にエラーは発生していません。VS.NET で作成された DLL で実行すると、同じ 2 つの警告が表示されるので、これは危険だと思います。
static void showMessage(const wchar_t *wmsg)
{
std::wcout << wmsg << std::endl;
::MessageBox(NULL, wmsg, TEXT("Message"), MB_OK);
}
static void testLoadLibrary(const wchar_t *lib)
{
::SetLastError(0L);
::SetErrorMode(0);
std::wstringstream wss;
wss << "LoadLibrary: " << lib;
showMessage(wss.str().c_str());
HINSTANCE LoadME = ::AfxLoadLibrary(lib);
if (LoadME == NULL) {
DWORD dw = ::GetLastError();
wss << "Failed: Error code " << dw;
showMessage(wss.str().c_str());
ErrorExit(lib, dw);
} else {
wss << "LoadLibrary of " << lib << " succeeded.";
showMessage(wss.str().c_str());
::FreeLibrary(LoadME);
}
}
最後に、Process Monitor (sysinternals.com) を実行してテスト プログラムを監視し、Path に文字列 "dll" を含むすべてのエントリを調べました。このリストには特に有益なものはありません。DLL の読み込みに失敗する理由がわかりません。
DONT_RESOLVE_DLL_REFERENCES で LoadLibraryEx を使用すると、ライブラリが読み込まれるため、これは依存関係の問題のように見えます。そのため、依存関係ウォーカーが特に役に立たないことに驚いています。
Windows 2008 R2 と Windows 2003 でこれを試しました。同じ動作。
助言がありますか?