Подскажите, как вызвать не экспортную функцию из dll. Адрес функции в виде 00089400, а так же список аргументов известен.
примерно так: Code: type TMyProc = function(par1,par2: Integer): Integer; .... var MyProc: TMyProc = nil; ... MyProc:= TMyProc($00089400); // здесь должен быть адрес, по которому загружена процедура ..... i:= MyProc(par1,par);
гм. Сделал библиотеку с кодом Code: int Test( ) { return 16; } через IDA дезасемблировал ее, в HexReys'е вышло следующее: Code: signed int __cdecl sub_10003A30() { return 16; } Потом написал программу, загрузил библиотеку и использовал код: Code: int Test( ) { int funcexec = ((int (__cdecl *)( ))0x10003A30)( ); return funcexec; } В результате программа закрывается с ошибкой в в test.dll
1: test.dll должна быть загружена в адресное пространство твоей проги 2: указывай правильное соглашение вызова 3: адрес функции не обязательно будет такой 0x10003A30, как его показывает IDA, он может совсем быть другим, поэтому тебе его надо опредилять динамически
Насчет 1 и 2. все ок Насчет 3, как определить адрес функции в памяти, зная физическое смещение функции в dll файле ? Мне уже подсказали: int x = ( (int (__cdecl*)()) ((size_t)GetModuleHandle("test.dll")+0x3A30) ) ();
Code: HANDLE h = LoadLibrary( dll_path_name ); void (*f)(void) = GetProcAddress( h, "func_name_from_dll" ); f();
R0nin, ты вопрос внимательно читал? То, что ты написал - это динамическая загрузка DLL с последующим получением адреса и вызовом экспортируемой функции)