Не удалось получить GetProcAddress - PullRequest
0 голосов
/ 13 декабря 2018

У меня проблемы с загрузкой DLL в моем проекте назначения.

Вот файл заголовка:

Я опустил код, который работает и не имеет отношения к проблеме.По сути, hinstLib не является NULL, но когда строка Filter = (FILTPTR) GetProcAddress(hinstLib, "Filter"); выполняется, Filter не имеет значения.Мне кажется, что это говорит о том, что DLL была найдена, но она не может найти функцию «Фильтр» внутри DLL, и я понятия не имею, почему, хотя я могу ошибаться.Я до сих пор не могу понять, как это работает.

Вот библиотека DLL:

Есть идеи у кого-нибудь?Мы очень ценим любую помощь!

  • Джеймс

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

при выполнении строки Filter = (FILTPTR) GetProcAddress(hinstLib, "Filter"); значение Filter не имеет значения.Мне кажется, что это говорит о том, что DLL была найдена, но она не может найти функцию «Фильтр» внутри DLL, и я не знаю, почему

Функция, вероятно, экспортируется с оформлено имя.Вы не указываете соглашение о вызовах, поэтому по умолчанию обычно используется значение __cdecl, которое ставит перед именем функции знак подчеркивания, поэтому вместо этого оно будет экспортировано как "_Filter".Но это специфичное для компилятора поведение, поэтому дважды проверьте таблицу DLL EXPORTS с помощью средства просмотра / дампа PE, чтобы увидеть экспортируемое имя фактическое .Возможно, вам потребуется добавить файл .def в ваш проект, чтобы убедиться, что функция экспортируется как "Filter" по желанию.

0 голосов
/ 13 декабря 2018

Ваши спецификации неверны.Хороший, краткий способ сделать это - использовать один и тот же заголовок в DLL и APP, определяя интерфейс экспорта-импорта., Который использует такой макрос:

#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

И объявления:

extern "C" MY_DLL_API int Filter(int* data, int count, const WCHAR* parameterString);

Файл библиотеки .cpp будет использовать этот заголовок и определит MY_DLL_EXPORTS.

Если я правильно понимаю ваш код, вы сделали так, чтобы компоновщик пытался экспортировать одну и ту же функцию из обоих модулей?ALso, прототип функции должен быть C-совместимым, чтобы быть на самом деле extern "C"

...