Ошибка 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

Другие вопросы по тегам