Как вызвать функцию из dll
Перейти к содержимому

Как вызвать функцию из dll

  • автор:

Как вызывать функции из чужой 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*

и все заработало.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

cpp

  • 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *