** начинающий |
Отправлено: 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
|
Никак.
Просто обычно при динамическом подключении используют
typedef, типа
CODE |
typedef void ( __stdcall *TDClosePlugin)(HANDLE);//
ну или соответственно
typedef void (__cdecl *TDClosePlugin)(HANDLE);//
|
с такими спецификаторами, с которыми функция в DLL и описанна.
а потом уже по тексту пользуются полученным типом (в нашем случае это TDClosePlugin) для получения указателя на функцию.
Просто не стоит все проблемы решать приведением. Хотя бы из тех соображений, что разные типы наплодили не просто так
|
|
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? |
Ничего она не отказывается.
Просто вы ее неправильно готовите.
Тогда ее имя будет не "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", так и буду. нафига мне эти зверские имена в стиле С++?
|
|
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);
|
|