Библиотека загрузки DLL - код ошибки 126

Я использую LoadLibrary из Windows API, когда я запускаю приложение, он выдает мне код ошибки 126. Я читал, что это может быть вызвано зависимостями, я проверил, что не так с некоторыми приложениями, такими как Dependency Walker, но все было хорошо.

LoadLibrary в приложении:

            HMODULE dll_mod = LoadLibrary(L"path_to_dll");
            if(dll_mod==NULL){
                std::stringstream error;
                error << "Could not load plugin located at:\n" << file_full.toStdString() << "\n" << "Error Code: " << GetLastError();
                FreeLibrary(dll_mod);
                return error.str();
            }

Код плагина:

#include "stdafx.h"
#define DLL_EXPORT
#define PLUGIN_STREAM __declspec(dllexport)
#include <iostream>
#include <vector>
using std::vector;
using std::string;
// Init event (After the loading)
extern "C"{
PLUGIN_STREAM int onInit(char* argv){
return 0;
}
PLUGIN_STREAM void pluginInfo(vector<string> & info){
info.push_back("media_event=false");
    info.push_back("status_event=false");
    info.push_back("send_event=true");
    info.push_back("plugin_name='RadioStream'");
    info.push_back("description='This plugin was designed for that people that wants to listen to radio music.\nYou can register your radio and play it later, also we have a gallery of radios that you can check.\nThis plugin is original of Volt and it's originally implemented in the application.'");
    info.push_back("success:0");
    info.push_back("error:1=Could not open data file");
    info.push_back("error:2=Could not prepare plugin");
    info.push_back("alert:40=Could not connect to that radio");
}
}

person Spamdark    schedule 16.01.2013    source источник
comment
на какой платформе вы программируете? Я только что набрал LoadLibrary failed в Google, и он сразу же автозаполнение с LoadLibrary не удалось с кодом ошибки 126, давая что-то вроде 41000 результатов, включая видео YouTube о том, как это исправить. неужели ни одна из этих ссылок не полезна?   -  person Andy Prowl    schedule 16.01.2013
comment
Я следил за некоторыми руководствами, они говорили о зависимостях ... о том, что dll не существует, ну, у меня около 4 часов поиска, и я не могу исправить это с помощью какого-либо учебника, я уже проверил зависимости ....: S   -  person Spamdark    schedule 16.01.2013
comment
Не рекомендуется вызывать FreeLibrary(dll_mod); под if(dll_mod==NULL)   -  person borisbn    schedule 16.01.2013
comment
вы уверены, что не пытаетесь загрузить 64-битную библиотеку из 32-битного исполняемого файла? или наоборот? или что ваша 32-битная DLL прямо или косвенно не зависит от 64-битных библиотек? или наоборот? вы проверили, что ваша DLL видна вашему приложению? где находится файл DLL и где находится файл EXE?   -  person Andy Prowl    schedule 16.01.2013
comment
И еще один момент: вы должны вызвать GetLastError сразу после LoadLibrary, потому что конструктор stringstream и его оператор ‹< могут (потенциально) вызвать какой-то WinAPI, который сбросит последнюю ошибку в ноль   -  person borisbn    schedule 16.01.2013


Ответы (4)


Ошибка 126 dll Windows может иметь множество основных причин. Я нашел самые полезные методы для отладки:

  1. Используйте dependency walker для поиска очевидных проблем (что вы уже сделали)
  2. Используйте утилиту sysinternals Process Monitor http://technet.microsoft.com/en-us/sysinternals/bb896645 от Microsoft, чтобы отслеживать доступ ко всем файлам, пока ваша dll пытается загрузиться. С помощью этой утилиты вы увидите все, что эта dll пытается втянуть, и обычно проблема может быть определена оттуда.
person DanS    schedule 16.01.2013
comment
Вот и все! С помощью этой утилиты я обнаружил ошибку, большое спасибо! - person Spamdark; 16.01.2013
comment
@Spamdark: мы рады за вас. Пожалуйста, опубликуйте, в чем была причина - person Andriy Tylychko; 16.01.2013
comment
Это была зависимость, я не знаю, почему обходчик зависимостей не обнаружил или не выдал никаких ошибок. Теперь все работает нормально :) - person Spamdark; 16.01.2013
comment
К сожалению, часто обходчик зависимостей не может показать недостающие зависимости, а также часто показывает ложные срабатывания. Несколько лет назад он казался намного более надежным - возможно, он не очень хорошо успевает за последними операционными системами. - person JDiMatteo; 01.01.2015
comment
в моем случае LoadLibaryA (somedll.dll) вернулся с 126. somedll.dll был там, но ему нужен someOtherDll.dll, который не был установлен. ProcessMonitor помог найти эту проблему. - person TomEberhard; 05.11.2015
comment
Благодарность! Я бы отредактировал ответ, добавив, что в мониторе процесса вы можете фильтровать результаты, чтобы отображать только то, что вы ищете! - person Robson; 31.05.2017
comment
Хороший ответ. Добавление ссылки на страницу справки Dependency Walker с некоторыми описаниями такого потенциала скрытые зависимости - в частности, см. пункты 4 и 5. - person Stein Åsmul; 13.12.2017
comment
Я сомневался, что Process Monitor что-нибудь обнаружит, но когда я посмотрел на строки, окружающие мою загружаемую dll, я увидел, что MSVCP140D.dll давал результат NAME NOT FOUND. Оказывается, машина, которая не смогла загрузить мою dll, не имеет D-версии MSVCP140.dll. Все работало, когда я собрал свою dll для выпуска! - person Pakman; 18.10.2018
comment
Я использовал монитор процесса, но событие показывает, что он пытается загрузить некоторую dll с японским именем. Я использую создатель Qt. D:\thomas\works\qt\2\build-test1-Desktop_Qt_5_11_1_MSVC2017_64bit-Debug\debug\㩄琯潨慭⽳潷歲⽳瑱㈯戯極摬琭獥ㅴ䐭獥瑫灯兟彴張ㄱㅟ䵟噓㉃㄰強㐶楢⵴敄畢⽧敤畢⽧牃䥤挲㈳搮汬.DLL - person thomachan; 01.02.2019
comment
Зависимость Уокер сработала как шарм. Спасибо, что напомнили мне о его существовании! - person hidefromkgb; 22.07.2019

Это также может произойти, когда вы пытаетесь загрузить DLL, и для этого, в свою очередь, требуется другая DLL, которую невозможно найти.

person Shivanshu Goyal    schedule 07.04.2020

Эта ошибка может произойти из-за того, что некоторая библиотека MFC (например, mfc120.dll), от которой зависит DLL, отсутствует в папке windows / system32.

person Iacopo Braccesi    schedule 19.09.2017

Это сработало для меня Распространяемые пакеты Visual C ++

person 22WhoAmI22    schedule 07.02.2020
comment
В моем случае я собрал tesseract.dll из исходного кода и не смог использовать его на той же машине сборки, потому что загрузка dll завершилась ошибкой 126. Зависимость Walker показала, что msvcp140.dll и vcruntime140.dll отсутствуют. Да, эти библиотеки DLL устанавливаются вместе с Visual C ++ Redistributable для Visual Studio 2015 (microsoft.com/en-us/download/confirmation.aspx?id=48145). - person Alexander Samoylov; 16.03.2020