У меня есть проект, который я преобразовал из Visual Studio 2003 .NET в Visual Studio 2010. Это НЕ проект .NET;это Visual C ++ (неуправляемый).
Библиотека DLL загружает дополнительные библиотеки DLL.Если я связываю исполняемый файл с этой DLL, то исполняемый файл умирает во время инициализации DLL.(Я могу сказать, что есть конструкторы для статических объектов, которые вызываются, и я вижу их работу.) Я удалил ВСЕ DLL, созданные VS 2010, из моего пути, за исключением одной из них, которая вызывает ошибку.Замена этой версии созданной VS.NET позволяет запускать программу.
Поскольку я не получаю никакой полезной информации, я решил написать тестовое приложение, которое не имеет прямой связи с DLL,но вместо этого использует LoadLibrary для загрузки библиотеки.Идея состояла в том, чтобы я мог использовать GetLastError (), чтобы помочь выяснить проблему с библиотекой.Не идти;Я получаю код ошибки -529697949, который вообще не является кодом ошибки Windows!(Если я изменю DLL на версию, созданную VS.NET, программа загрузит DLL должным образом.)
Я использовал Dependency Walker (www.dependencywalker.com), чтобы проверить DLL, и он говорит мнечто «хотя бы один модуль зависимости задержки загрузки не найден», выделив IESHIMS.DLL и WER.DLL.Я не вижу другой ошибки с этим инструментом.Запуск его в созданной VS.NET DLL показывает те же два предупреждения, поэтому я полагаю, что это красная сельдь.
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 не загружается.
Если я использую LoadLibraryEx с DONT_RESOLVE_DLL_REFERENCES, библиотека загружается, так что это действительно похоже на проблему зависимости, котораяВот почему я удивлен, что обходчик зависимостей не особенно полезен.
Я пробовал это на Windows 2008 R2 и Windows 2003;такое же поведение.
Есть предложения?