|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
универсальная загрузка dll
Здравствуйте, уже полторы недели туплю, над "волшебной" функцией заданной мне преподом, эта "уникальная" функция должна уметь загружать библиотеки, и использовать их функции, основоваясь на входящих аргументах: имя длл, имя функции, внутренние аргументы, заданные строкой. т.е. примерно так
Код:
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; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо 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
|
||||
|
||||
А препод с каким званием? Доцент/профессор?
Чем-то смахивает на "подметать плацдарм ломом". — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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); jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 22.10.2012 в 21:14. |
#6
|
|||
|
|||
спасибо, потестю)
а что делать если среди параметров есть строка? |
#7
|
||||
|
||||
Только не забудь перевести параметры в массив Params. Count, соответственно, количество элементов в массиве Params.
Задание конечно прикольное, но какое-то наркоманское. jmp $ ; Happy End! The Cake Is A Lie. |
#8
|
||||
|
||||
Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
|||
|
|||
Цитата:
|
#10
|
||||
|
||||
Параметры по 4 байта передаются, указатели 4-х байтные, если передается байт, он дополняется нулями, например 10h => 00000010h
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#11
|
||||
|
||||
PChar/PAnsiChar - это указатель. Указатель на строку. String кстати говоря тоже, но строка там немного хитрого формата (перед ней идут доп поля). Дворды - с ними и так все ясно. Структуры тут самое сложное, их надо делить на части по 4 байта и запихивать частями.
jmp $ ; Happy End! The Cake Is A Lie. |
#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
|
|||
|
|||
в каком месте я её использую о_О, или как и зачем её использовать?
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|