C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DLL — как правильно вызвать, помогите разобраться
** начинающий
Отправлено: 07.09.2004, 13:11


Не зарегистрирован







господа профи,пожалуйста не игнорируйте мой вопрос.
он весьма тривиален. у меня есть xxx.dll в ней находится функция
func1(any_param)
как правильно вызвать эту функцию из библоотеки?
т.е.

LoadDLL("xxx.dll");
func1(any_param);

не достаточно, а что необходимо еще?
** начинающий
Отправлено: 07.09.2004, 13:18


Не зарегистрирован







прошу прощения за ошибку
не LoadDLL("xxx.dll"); а
LoadLibrary("xxx.dll");
Guest
Отправлено: 07.09.2004, 13:26


Не зарегистрирован







Есть такая пимпочка, "Поиск по Форуму" называется. Тыкать в него ни кому не запрещено.
joynter
Отправлено: 07.09.2004, 15:58


Станционный диспетчер

Группа: Участник
Сообщений: 137



--------
typedef тип_возвращаемого_значения_функции_func1 (__import *FType(тип_переменной_any_param*);
FType *func1;
HMODULE hDLL;
--------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
func1 = (FType *)GetProcAddress(hDLL, "func1");
func1(any_param);
}

что-то типа того (звездочки обязательны)
AVC
Отправлено: 07.09.2004, 17:16


Ветеран

Группа: Модератор
Сообщений: 1583



Прошу прощения, что ссылаюсь на себя — вот похожие темы
DLL — Quick Report — BDE, Помогите кто сможет !!!
Форма в DLL
Sl@Sh
Отправлено: 03.10.2004, 12:46


Мастер участка

Группа: Участник
Сообщений: 383



В библиотеке функцию зови так :
extern "C" void __export func1()
{

}
а там, откуда вызываеш так :
void__fastcall TForm1::Button1.Click(TObject *Sender)
{
void (__stdcall *func1)();
HINSTANCE dllp = LoadLibrary("xxx.dll");
if (dllp) {
func1 = (void(__stdcall *) ())
GetProcAddress(dllp, "_func1");
if (func1) func1();
}
FreeLibrary(dllp);
}
Удачи !

Отредактировано Sl@Sh — 03/10/2004, 13:51
Asher
Отправлено: 04.10.2004, 08:59


Мастер участка

Группа: Модератор
Сообщений: 550



to Sl@Sh:

если при этом функция окажется не __stdcall, а __cdecl, то вы с таким приведением (__stdcall *) огребете очень и очень большие проблемы со стеком
Sl@Sh
Отправлено: 05.10.2004, 16:00


Мастер участка

Группа: Участник
Сообщений: 383



to Asher :

А как это обойти ?
Asher
Отправлено: 06.10.2004, 10:46


Мастер участка

Группа: Модератор
Сообщений: 550



Никак. cool.gif
Просто обычно при динамическом подключении используют
typedef, типа
CODE

typedef void ( __stdcall *TDClosePlugin)(HANDLE);//
ну или соответственно
typedef void (__cdecl *TDClosePlugin)(HANDLE);//

с такими спецификаторами, с которыми функция в DLL и описанна.
а потом уже по тексту пользуются полученным типом (в нашем случае это TDClosePlugin) для получения указателя на функцию.

Просто не стоит все проблемы решать приведением. Хотя бы из тех соображений, что разные типы наплодили не просто так
biggrin.gif biggrin.gif biggrin.gif
olegenty
Отправлено: 06.10.2004, 15:38


Ветеран

Группа: Модератор
Сообщений: 2412



у меня непонятка:
почему без модификатора
extern "С" функция отказывается экспортироваться из DLL?

т.е.
extern "C" __declspec(dllexport) __stdcall int RefCount() — экспортируется,
а
__declspec(dllexport) __stdcall int RefCount() — нет, хотя по документации, вроде должна.
Asher
Отправлено: 06.10.2004, 19:33


Мастер участка

Группа: Модератор
Сообщений: 550



QUOTE
у меня непонятка:
почему без модификатора
extern "С" функция отказывается экспортироваться из DLL?

Ничего она не отказывается. biggrin.gif
Просто вы ее неправильно готовите. biggrin.gif biggrin.gif biggrin.gif
Тогда ее имя будет не "RefCount" в стиле "C",
а что-то вроде "?RefCount@@YAHXZ " в стиле "C++"

имя вы можете узнать для своих функций посмотрев в файл ExpFun.def, созданный с помощью:
impdef.exe -h ExpFun.def Expfun.dll
Также для Exe:
impdef.exe -h Project1.def Project1.exe
olegenty
Отправлено: 07.10.2004, 07:37


Ветеран

Группа: Модератор
Сообщений: 2412



да всё я правильно готовлю, потому что всю жизнь писал
extern "C"
а тут задумался: а нафига я это пишу? в справке написано: чтобы не искажать имени функции. и ничего больше. ты вот понятный ответ дал... как писал extern "C", так и буду. нафига мне эти зверские имена в стиле С++? smile.gif
Admin
Отправлено: 07.10.2004, 12:34


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE (** начинающий @ 07/09/2004, 14:13)
господа профи,пожалуйста не игнорируйте мой вопрос.
он весьма тривиален. у меня есть xxx.dll в ней находится функция
func1(any_param)
как правильно вызвать эту функцию из библоотеки?
т.е.

LoadDLL("xxx.dll");
func1(any_param);

не достаточно, а что необходимо еще?

Есть динамическое присоединение dll, есть статическое.
Все о чем выше говорили — относится к динамическому.
От этого зависит и как функцию из dll вызывать.

Динамически:
То есть, exe сам по себе, dll сам по себе, в определенный момент
понадобилась функция из некой dll,
мы динамически загружаем эту dll через LoadLibrary(),
получаем адрес этой функции через GetProcAddress()
и вызываем эту функцию.

Статически:
При статическом присоединении ничего этого не надо.
Нужен файл .lib который прилинковывается к вашему exe
Тогда функцию из dll вызываете как свою собственную:
func1(any_param);

Вернуться в Вопросы программирования в C++Builder