Ошибка LoadLibrary; GetLastError не помогает
У меня есть проект, который я преобразовал из 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; такое же поведение
Какие-либо предложения?
1 ответ
Существует инструмент ОС для диагностики подобных проблем. Загрузите SDK или DDK и используйте gflags.exe, чтобы установить "Показать привязки загрузчика" (+sls) для процесса. Это должно раскрыть причину сбоя загрузки DLL.
Вывод привязок загрузчика появится в окне вывода отладчика.
Martyn