Загрузить библиотеку в C - PullRequest
0 голосов
/ 06 июня 2019

У меня есть DLL, сгенерированная в Matlab с помощью компилятора LCC, и я хочу вызвать функцию из этой DLL.Имя DLL - fcn_acDklGenerator, а имя функции - также fcn_acDklGenerator, поэтому я написал приведенный ниже код, но он не работает при загрузке библиотеки.

char* libName = "\\fcn_acDklGenerator.dll";
TCHAR libFullPath[MAX_PATH + 1] = { 0 };
GetCurrentDirectory(MAX_PATH, libFullPath);
strcat_s(libFullPath, sizeof libFullPath, libName);
HMODULE matlab = LoadLibrary(libFullPath);

Вывод LoadLibrary равен NULL, пока я проверялЗначение libFullPath, и я уверен, что DLL находится по этому пути.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

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

Причины, по которым LoadLibrary может дать сбой:

  • Файл .dll не найден, не читается или не исполняется.(Это может усложниться из-за различных правил поиска, перенаправления файловой системы, другой DLL с тем же именем, уже загруженной в процесс, кеша SxS, списков ACL, эксклюзивного общего доступа, пометки для удаления, вмешательства со стороны средств защиты от вредоносных программ и т.1007 *

  • DLL является 64-битной, и вы пытаетесь загрузить ее в 32-битный процесс, или наоборот.

  • DLLзависит (прямо или косвенно) от другой DLL, которая не загружается.(Другими словами, этот список, возможно, придется применять рекурсивно.)

  • Нет разумного диапазона адресов, доступного для DLL (крайне маловероятно).

  • DllMain (или эквивалентная функция с другим именем) использует неправильное соглашение о вызовах.

  • DLLMain возвращает ошибку.

  • DllMain создаеттупик.Хотя это обычно приводит к зависанию, вполне возможно, что в некоторых случаях загрузчик может обнаружить его и просто сбросить нагрузку.

Методы диагностики определенного экземпляра:

  • Проверка GetLastError сразу после неудачного вызова LoadLibrary обычно помогает сузить возможности.

  • В зависимости от настройки SetErrorMode для процесса, вы также можете получить некоторую информацию из появляющихся диалогов.

  • Переход по вызову LoadLibrary в отладчике, например в Visual Studio, может давать подсказки в окнах вывода отладки., как вы можете видеть, какие другие библиотеки DLL загружаются вместе с той, которую вы запросили.

  • Вы также можете использовать инструмент, такой как PROCMON Sysinternals, чтобы увидеть, какие пути на самом деле ищутся, какого типаошибки ввода-вывода: неудачная попытка открыть файл и т. д.

  • Вы можете временно заменить сложный DllMain на мелочиl один, чтобы определить, является ли комплекс DllMain причиной сбоя.

Такие инструменты, как dumpbin и DependencyWalker, могут ответить на вопросы о битности, о том, экспортируется ли DllMain, и какие другие DLL требуются.

0 голосов
/ 06 июня 2019

Перед вызовом кода проверки места LoadLibrary:
if ( GetFileAttributes(libFullPath) == 0xFFFFFFFF ) { //Something went wrong //print error code for GetLatError() }

После вызова кода проверки места LoadLibrary:
if ( matlab == NULL ) { //Something went wrong //print error code for GetLatError() }

...