VC++-MFC: LoadLibrary возвращает неверный дескриптор 0x10000000
Я не могу загрузить свой test.dll (в VC++ - MFC), используя LoadLibrary()
API. Я получаю код ошибки 126 (Module not found)
с помощью GetLastError()
, По ходячим зависимостям я узнал, что мой test.dll зависит от "xerces-c_2_7.dll" и "Xalan-C_1_10.dll". Эти библиотеки уже присутствовали на том же пути, что и exe. Тем не менее я получаю ошибку. Поэтому я попытался загрузить обе вышеупомянутые сторонние библиотеки DLL с помощью LoadLibrary()
который вернул дескриптор как 0x10000000
, От GetLastError()
я получаю
error code 6 (Invalid Handle).
Кто-нибудь может подсказать, почему я получаю ошибку Invalid Handle?
Ниже приведен фрагмент кода:
HINSTANCE hLib = LoadLibrary(_T("Xalan-C_1_10"));
TCHAR szMessage[MAX_PATH];
FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
szMessage, MAX_PATH, NULL);
hLib = LoadLibrary(_T("xerces-c_2_7"));
FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
szMessage, MAX_PATH, NULL);
2 ответа
Перегоняя твою проблему, я собираю
Вы можете загрузить Xerces и Xalan по отдельности, но не файл test.dll (который ссылается на другие библиотеки DLL)
Вы можете быть введены в заблуждение ценностью
GetLastError()
возвращается при загрузке Xerces или Xalan
Помните, что вы должны позвонить GetLastError()
сразу после LoadLibrary
звонок: из документов MSDN:
Вы должны вызывать функцию GetLastError немедленно, когда возвращаемое значение функции указывает, что такой вызов вернет полезные данные. Это происходит потому, что некоторые функции вызывают SetLastError с нулем, когда они успешны, стирая код ошибки, установленный самой последней ошибочной функцией.
Скорее всего, это проблема разрешения зависимости / пути (т.е. LoadLibrary
не могу найти запрошенное изображение). Итак, у вас есть два варианта:
Есть ли у test.dll/Xerces/Xalan другие зависимости, которые вы не скопировали в папку вашего исполняемого файла?
Поместите dll в папку Windows\System32 и попробуйте снова. Если это работает, то вы можете быть уверены, что столкнулись с проблемой пути. Прочитайте страницу MSDN на
LoadLibrary
- это немного сбивает с толку, но есть некоторые детали, которые легко опустить.использование
GetCurrentDirectory
а такжеSetCurrentDirectory
переключиться в и из исполняющей папки приложения и резидентной папки DLLУкажите полный путь к dll в вызове
LoadLibrary
, Вы можете столкнуться с проблемами, если имя пути содержит пробелы (об этом я вспоминаю из памяти, пожалуйста, уточните в MSDN).Сделав это, будь хорошим гражданином и звони
FreeLibrary
!
Test.dll ваша DLL или сторонняя DLL?
If it is a your DLL,
вы должны легко увидеть в коде незавершенные библиотеки DLL и их точный путь.
If it is third party DLL,
вам нужно попробовать путь к Windows, путь к программным файлам, ваш путь к тестовой DLL и т. д. Помните, что это всего лишь попытка. Иногда они могут ссылаться на путь, который известен создателю DLL, если не задокументирован)
Надеюсь, этот ответ поможет!