![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, уже полторы недели туплю, над "волшебной" функцией заданной мне преподом, эта "уникальная" функция должна уметь загружать библиотеки, и использовать их функции, основоваясь на входящих аргументах: имя длл, имя функции, внутренние аргументы, заданные строкой. т.е. примерно так
Код:
Function SetFunction(dll,adress:string;a:array of b;l:integer):b;
var
Func:function(a:array of b):HINST;stdcall;
_dll:integer;
begin
_dll:=LoadLibrary(PChar(dll));
if(_dll<>0)then
begin
@Func:=getProcAddress(_dll,PChar(adress));
if(addr(Func)<>nil)then
begin
Func(a);
//setlength(result,l);
end;
end;
end;это то что я наклепал, я никак не могу решить праблу внутренних параметров(((( глаза уже мутные и мозг плавится, кто подскажет... помогите, всё что плохо обьяснил спросите, отвечу как смогуууу |
|
#2
|
||||
|
||||
|
Веселый, однако, препод. В длл функции могут по разным соглашениям вызываться, да и кол-во аргументов ф-ии заведомо не известно может быть. Если надо чтоб идеально работало, надо писать алгоритм анализа, как устроена ф-ия в длл (самый простой вариант - искать информацию в map файле, если таковой имеется). если же простяцкое-босяцкое, то просто пушить в стек аргументы (если дллка stdcall).
Код:
asm push arg3 push arg2 push arg1 call Func end; |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
reqyz (22.10.2012)
| ||
|
#3
|
|||
|
|||
|
можно подробнее пример, да функции stdcall, как этот асм использовать я с асемом просто дело не имел никогда(
с прописанием внутренних аргументов вся и загвоздка представь, есть форма, на ней куча едитов, в первый выбираешь имя длл во второй имя функции в ней, в третьем выбираешь типы параметров и значения, наример integer 8 string 'thtyhty' byte true нажимаешь кнопочку и это всё срабатывает, аргументы пусть пользователь вводит правильно, но программно то как это сформировать... ппц(( Последний раз редактировалось reqyz, 22.10.2012 в 20:27. |
|
#4
|
||||
|
||||
|
А препод с каким званием? Доцент/профессор?
Чем-то смахивает на "подметать плацдарм ломом". |
|
#5
|
||||
|
||||
|
Цитата:
Код:
var hModule: DWORD;
proc: pointer;
a: DWORD;
Params: array of DWORD;
...
hModule := LoadLibrary(Edit1.Text);
proc := GetProcAddress(hModule, Edit2.Text);
if (proc <> 0) then
begin
asm
mov esi, Params
mov ecx, count
lea esp, [esp - ecx * 4]
mov edi, esp
cld
rep movsd
mov eax, proc
call eax
end;
end
else
MessageBoxA(0, 'Печальная история...', 'Ошибка', 0);Последний раз редактировалось Bargest, 22.10.2012 в 21:14. |
|
#6
|
|||
|
|||
|
спасибо, потестю)
а что делать если среди параметров есть строка? |
|
#7
|
||||
|
||||
|
Только не забудь перевести параметры в массив Params.
Count, соответственно, количество элементов в массиве Params.Задание конечно прикольное, но какое-то наркоманское. |
|
#8
|
||||
|
||||
|
Цитата:
|
|
#9
|
|||
|
|||
|
Цитата:
|
|
#10
|
||||
|
||||
|
Параметры по 4 байта передаются, указатели 4-х байтные, если передается байт, он дополняется нулями, например 10h => 00000010h
|
|
#11
|
||||
|
||||
|
PChar/PAnsiChar - это указатель. Указатель на строку. String кстати говоря тоже, но строка там немного хитрого формата (перед ней идут доп поля). Дворды - с ними и так все ясно. Структуры тут самое сложное, их надо делить на части по 4 байта и запихивать частями.
|
|
#12
|
|||
|
|||
|
ух) ладно, всем спасибо, пойду мучаться, возникну вопросы, отпишусь тут, но не сегодня уже наверно)
|
|
#13
|
|||
|
|||
|
сделал библиотеку с простенькой функцией, пробовал использовать ваш пример, но неудачно( значения в библиотеку приходят искажёнными
Код:
Function SetFunction(dll,adress,param:string):boolean;
var
proc: pointer;
_dll:integer;
Params: array of DWORD;
count:integer;
p1,p2:string;
//param = integer:8;boolean:true; ...
begin
_dll:=LoadLibrary(PChar(dll));
if(_dll<>0)then
begin
proc:=getProcAddress(_dll,PChar(adress));
if(proc<>nil)then
begin
count:=0;
if(param<>'')then
repeat
p1:=copy(param,1,pos(':',param)-1);
delete(param,1,pos(':',param));
p2:=copy(param,1,pos(';',param)-1);
delete(param,1,pos(';',param));
inc(count);
setlength(params,count);
if(p1='Integer')then
Params[count-1]:=strtoint(p2)
else
if(p1='Boolean')then
Params[count-1]:=strtoint(p2)
else
if(p1='PChar')then
Params[count-1]:=integer(PChar(p2));
until(param='');
asm
mov esi, Params
mov ecx, count
lea esp, [esp - ecx * 4]
mov edi, esp
cld
rep movsd
mov eax, proc
call eax
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetFunction('Project2.dll','func','Boolean:1;Integer:10;PChar:rgtrhtyh;');
// SetFunction('shell32.dll','ShellExecuteA','Integer:0;PChar:;PChar:calc.exe;PChar:;Integer:0;');//а если так вообще ругается громко(
end;
что не так?( Последний раз редактировалось reqyz, 23.10.2012 в 11:43. |
|
#14
|
||||
|
||||
|
Цитата:
|
|
#15
|
|||
|
|||
|
в каком месте я её использую о_О, или как и зачем её использовать?
|
![]() |
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|