Как вызывать функции из чужой DLL?
У меня имеется чужая dll-ка. И есть пример на VB6.0 использования этой dll. dll- не COM-сервер.
Мне в итоге нужно используя jni вызывать эту dll из java.
Но как вызвать эту dll из c++, что бы написать jni-обертку?
- Вопрос задан более трёх лет назад
- 620 просмотров
1 комментарий
Оценить 1 комментарий
Александр Коробов @superbadlam Автор вопроса
Илья: Я чутка старше, но впечатление такое же.
Решения вопроса 1
C/C++ programmer
Загружаете DLL, находите нужные вам функции и вызываете их 🙂
Очень схематично как-то так:
// указатель на функцию, которая принимает параметр char* и возвращает int typedef int (__cdecl *_your_function)(char *auth_st); _your_function YourFunction; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) < HINSTANCE hLib = LoadLibrary("Path_to_DLL"); YourFunction = (_your_function)GetProcAddress((HMODULE)hLib, "Your_Function_name"); if(YourFunction == NULL) < //something wrong >int res = YourFunction ("some string"); >
Ответ написан более трёх лет назад
Нравится 3 4 комментария
Владимир Мартьянов @vilgeforce
Только загрузку DLL тоже было бы неплохо проверять и WinMain не обязателен, все эти параметры все равно не используются 😉
Владимир Мартьянов: поэтому я и написал, что все это «очень схематично»
Александр Коробов @superbadlam Автор вопроса
Спасибо. Видать это то, что нужно. Пошел читать про указатели на функции.
Таблицу экспортируемых dll функций, кстати, показывает утилита depends.exe. Также надо учесть, что если функция именно C++ (а не С), то там есть весьма своеобразное изменение (т.н. декорирование) имен.
Ответы на вопрос 1
Александр Коробов @superbadlam Автор вопроса
Единственное, что в моем случае в объявлении
typedef int (__cdecl *_your_function)(char *auth_st);
заменил __cdecl* на __stdcall*
и все заработало.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- C++
Почему символ строки с индексом 0 выводит символ под индексом 1?
- 1 подписчик
- 18 часов назад
- 51 просмотр
Вызов функции DLL
Хотя вызов неуправляемых функций DLL почти идентичен вызову другого управляемого кода, все же существуют отличия, которые поначалу могут вызвать некоторые сложности в освоении функций DLL. В этом разделе представлены статьи, касающиеся некоторых особенностей вызовов.
Структуры, возвращаемые из вызовов неуправляемого кода, должны быть типами данных, имеющими одинаковые представления в управляемом и неуправляемом коде. Такие типы называются непреобразуемыми типами, так как они не требуют преобразования (см. раздел Непреобразуемые и преобразуемые типы). Чтобы вызвать функцию с преобразуемой структурой в качестве ее возвращаемого типа, можно определить непреобразуемый вспомогательный тип того же размера, что и преобразуемый тип, и преобразовать данные после возвращения функции.
В этом разделе
Передача структур
Описываются вопросы передачи структур данных с предопределенной компоновкой.
Функции обратного вызова
Основные сведения о функциях обратного вызова.
Практическое руководство. Реализация функций обратного вызова
Описывается реализация функций обратного вызова в управляемом коде.
Связанные разделы
Использование неуправляемых функций DLL
Описывает способ вызова неуправляемых функций DLL с помощью вызова платформы.
Маршаллирование данных с помощью вызова платформы
Описывается способ объявления параметров метода и передачи аргументов в функции, экспортируемые неуправляемыми библиотеками.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Вызов функций библиотек DLL из приложений Visual Basic
Для вызова функций на C или C++ из библиотеки DLL в приложениях на Visual Basic (или других языках, таких как Pascal или Fortran) эти функции необходимо экспортировать с использованием правильного соглашения о вызовах без какого-либо декорирования имен компилятором.
__stdcall создает правильное соглашение о вызове для функции (вызываемая функция очищает стек, а параметры передаются справа налево), но декорирует ее имя. Поэтому если для экспортированной функции в библиотеке DLL используется __declspec(dllexport) , экспортируется декорированное имя.
Префикс __stdcall украшения имени символа с символом подчеркивания ( _ ) и добавляет символ с символом знака (@), за которым следует число байтов в списке аргументов (требуемое пространство стека). В результате функция, объявленная как:
int __stdcall func (int a, double b)
декорируется как _func@12 в выходных данных.
Соглашение о вызовах C ( __cdecl ) декорирует имя как _func .
Чтобы получить декорированное имя, используйте /MAP. Использование __declspec(dllexport) приводит к следующим результатам:
- Если функция экспортируется с помощью соглашения О вызове C, она удаляет ведущий символ подчеркивания ( __cdecl_ ) при экспорте имени.
- Если экспортируемая функция не использует соглашение о вызовах C (например, __stdcall ), экспортируется декорированное имя.
Так как переопределить место, где происходит очистка стека, невозможно, необходимо использовать __stdcall . Чтобы отменить декорирование имен при использовании __stdcall , необходимо указать их в виде псевдонимов в разделе EXPORTS файла DEF. Вот пример для следующего объявления функции:
int __stdcall MyFunc (int a, double b); void __stdcall InitCode (void);
EXPORTS MYFUNC=_MyFunc@12 INITCODE=_InitCode@0
Для вызова библиотек DLL программам, написанными на Visual Basic, необходимо использовать прием с файлом DEF, описанный в этой статье. Если псевдоним задается в программе Visual Basic, использовать псевдонимы в файле DEF необязательно. Это можно сделать в программе Visual Basic, добавив предложение alias в оператор Declare.
Дополнительные сведения
- Экспорт из библиотеки DLL
- Экспорт из библиотеки DLL с использованием DEF-файлов
- Экспорт из библиотеки DLL с использованием __declspec(dllexport)
- Экспорт функций на языке C++ для использования в исполняемых модулях, исходный код которых написан на языке C
- Определение подходящего способа экспорта
- Внутренние имена
Как вызвать функцию из dll
Нравится ресурс?
Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ !
4. Используйте теги [ code=vba ] . текст программы. [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.
Модераторы: SCINER, B.V.