VC ++ - MFC: LoadLibrary возвращает неверный дескриптор 0x10000000 - PullRequest
0 голосов
/ 26 октября 2009

Я не могу загрузить свой 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 ]

1 голос
/ 26 октября 2009

Перегоняя твою проблему, я понимаю:

  • Вы можете загружать Xerces и Xalan по отдельности, но не файл test.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!

0 голосов
/ 15 апреля 2010

Является ли test.dll вашей DLL или сторонней библиотекой DLL?

If it is a your DLL, 

вы должны легко увидеть в коде незавершенные библиотеки DLL и их точный путь.

If it is third party DLL,

вам нужно попробовать путь к Windows, путь к программным файлам, ваш путь к тестовой DLL и т. Д. Помните, что это всего лишь попытка. Иногда они могут ссылаться на путь, который известен только создателю DLL , если не задокументировано )

Надеюсь, этот ответ поможет!

...