Re: получение параметров функции по указателю и имени
От: Кодт Россия  
Дата: 18.09.07 15:15
Оценка:
Здравствуйте, Arier, Вы писали:

A>Нужно узнать число параметров у функции в dll, зная адрес данной функции и её имя.


В С++ рефлексии нет.

A>Ну или подскажите способ вызова функций по адресу и имени!Спасибо


int __stdcall the_foo(char, double, int) { ..... }

typedef void(*VoidFunc)(); // все функции можно привести к этому типу
VoidFunc vf = foo;

typedef int (__stdcall *FooType)(char,double,int);
FooType some_foo = (FooType)vf; // получили из обезличенного указателя - указатель нужного типа
int x = some_foo('a',1.23,45); // и вызвали


Конкретно что касается DLL под виндами,
HMODULE hLib = LoadLibrary("the.dll");
FooType some_foo = (FooType) GetProcAddress(hLib, "the_foo"); // если функция была экспортирована под этим именем


Ну и чтоб два раза не вставать, упомяну, что
— экспортные имена у функций из С++ных библиотек, как правило, декорированы (mangled, decorated) — содержат суффикс с информацией о типе, это нужно для перегрузки
— можно заставить компилятор экспортировать/импортировать недекорированные имена — они объявляются как extern "C"
— однако, для разных конвенций вызова такие имена будут остаточно декорированы в стиле Си или WinAPI — "_the_foo" (конвенция __cdecl) или "the_foo" (конвенция __stdcall)
— в .def-файле можно указать линкеру, как именно экспортировать функцию — вплоть до того, что её именем будет целое число
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.