Попытка загрузить DLL с помощью LoadLibrary и получить R6034 «Приложение предприняло попытку загрузить библиотеку времени выполнения C неправильно» - PullRequest
3 голосов
/ 24 марта 2010

Я пишу программу-обертку, которая загружает входные плагины Winamp. До сих пор у меня это работало хорошо с несколькими плагинами, но для некоторых других я получаю сообщение об ошибке во время выполнения, когда пытаюсь вызвать LoadLibrary на DLL плагина. (Похоже, это происходит в основном с плагинами, которые были включены в Winamp.) Появляется диалоговое окно, в котором выдается код ошибки и сообщение выше. Это происходит, например, с плагинами in_flac.dll и in_mp3.dll (которые поставляются с Winamp). Любые идеи о том, как я могу исправить эту ситуацию?

EDIT: Это в основном перебирает плагины в каталоге и пытается загрузить, а затем освободить каждый из них. Некоторые плагины выдают ошибку, о которой я упоминал выше, а другие нет.

wstring path = GetSearchPath();

FileEnumerator e(path + L"in_*.dll");

while(e.MoveNext()) {

    wstring pluginPath = path + e.GetCurrent().cFileName;

    MessageBoxW(NULL, pluginPath.c_str(), L"Message", MB_OK);
    HINSTANCE dll = LoadLibraryW(pluginPath.c_str());
    if(!dll) {

        pluginPath = wstring(L"There was an error loading \"") + wstring(e.GetCurrent().cFileName) + L"\":\n" + LastErrorToString();
        MessageBoxW(NULL, pluginPath.c_str(), L"Error", MB_OK);

        continue;

    }

    FreeLibrary(dll);

}

Ответы [ 3 ]

3 голосов
/ 24 марта 2010

Начиная с Visual Studio 2005, среда выполнения C / C ++ ДОЛЖНА быть помещена в параллельный кеш Windows (C: \ windows \ WinSxS), поэтому размещение библиотеки CRT DLL рядом с вашим exe-файлом больше не работает ( с одним исключением, см. позже). Вы также ДОЛЖНЫ обращаться к DLL-библиотекам CRT через файл манифеста. Этот файл манифеста создается компоновщиком и будет иметь имя, например myexe.exe.manifest или mydll.dll.manifest. Распространите этот манифест с вашим приложением / DLL или скомпонуйте его в exe / dll с помощью команды mt.

Параллельный кэш и файловая система манифеста были введены в Windows XP и в основном предназначены для устранения ада DLL и повышения безопасности.

Если не ссылаться на CRT, использующий манифест или не помещающий CRT в параллельный кеш, возникнет ошибка 6034.

Если вы все еще хотите поместить DLL-библиотеку CRT рядом с вашим приложением, вы также можете использовать частные сборки, что означает создание своего рода миниатюрного параллельного кэша в папке вашего приложения. Вы можете найти дополнительную информацию по MSDN.

1 голос
/ 17 июля 2011

Также вы можете попробовать добавить это в код:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'\"")
1 голос
/ 24 марта 2010

может быть много причин ... поместите ваш код здесь для пояснения ... одно из многих решений может быть Перестройте свое приложение с помощью манифеста. Сборка приложения с помощью Visual Studio автоматически помещает манифест в полученный файл EXE или DLL. Если вы строите из командной строки, используйте инструмент mt.exe, чтобы добавить манифест в качестве ресурса. Используйте ID ресурса 1 при сборке EXE, 2 при сборке DLL.

...