Ошибка LoadLibrary;GetLastError не помогает - PullRequest
0 голосов
/ 27 мая 2011

У меня есть проект, который я преобразовал из 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 Ответ

2 голосов
/ 27 мая 2011

Существует инструмент ОС, помогающий диагностировать подобные проблемы. Загрузите SDK или DDK и используйте gflags.exe, чтобы установить «Показать привязки загрузчика» (+ sls) для процесса. Это должно раскрыть причину сбоя загрузки DLL.

Вывод привязок загрузчика появится в окне вывода отладчика.

Martyn

...