Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.10.2012, 20:02
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
Печаль универсальная загрузка 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  
Старый 22.10.2012, 20:11
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Веселый, однако, препод. В длл функции могут по разным соглашениям вызываться, да и кол-во аргументов ф-ии заведомо не известно может быть. Если надо чтоб идеально работало, надо писать алгоритм анализа, как устроена ф-ия в длл (самый простой вариант - искать информацию в map файле, если таковой имеется). если же простяцкое-босяцкое, то просто пушить в стек аргументы (если дллка stdcall).
Код:
asm
  push arg3
  push arg2
  push arg1
  call Func
end;
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
reqyz (22.10.2012)
  #3  
Старый 22.10.2012, 20:23
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

можно подробнее пример, да функции stdcall, как этот асм использовать я с асемом просто дело не имел никогда(

с прописанием внутренних аргументов вся и загвоздка

представь, есть форма, на ней куча едитов, в первый выбираешь имя длл во второй имя функции в ней, в третьем выбираешь типы параметров и значения, наример

integer 8
string 'thtyhty'
byte true

нажимаешь кнопочку и это всё срабатывает, аргументы пусть пользователь вводит правильно, но программно то как это сформировать... ппц((

Последний раз редактировалось reqyz, 22.10.2012 в 20:27.
Ответить с цитированием
  #4  
Старый 22.10.2012, 20:56
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

А препод с каким званием? Доцент/профессор?
Чем-то смахивает на "подметать плацдарм ломом".
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 22.10.2012, 21:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
представь, есть форма, на ней куча едитов, в первый выбираешь имя длл во второй имя функции в ней, в третьем выбираешь типы параметров и значения, наример
Код:
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);
Как-то так в случае, если параметры можно превратить в массив двордов Params (абсолютное большинство случаев). Если нельзя (суммарное кол-во байт не делится на 4) - то придется подобным образом с вордами (к счастью до байтов скатываться не придется - push для байта не существует, так что суммарный размер параметров всегда делится на 2 как минимум).
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 22.10.2012 в 21:14.
Ответить с цитированием
  #6  
Старый 22.10.2012, 21:15
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

спасибо, потестю)
а что делать если среди параметров есть строка?
Ответить с цитированием
  #7  
Старый 22.10.2012, 21:16
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Только не забудь перевести параметры в массив Params. Count, соответственно, количество элементов в массиве Params.
Задание конечно прикольное, но какое-то наркоманское.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 22.10.2012, 21:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от reqyz
спасибо, потестю)
а что делать если среди параметров есть строка?
Передавай через PChar/PAnsiChar.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 22.10.2012, 21:26
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Передавай через PChar/PAnsiChar.
оу, фуф.. так бывают и целые и строки и любые, в какой момент пчар использовать а в какой дворд, как это обьединить, или уже никак?(
Ответить с цитированием
  #10  
Старый 22.10.2012, 21:27
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Параметры по 4 байта передаются, указатели 4-х байтные, если передается байт, он дополняется нулями, например 10h => 00000010h
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 22.10.2012, 21:31
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

PChar/PAnsiChar - это указатель. Указатель на строку. String кстати говоря тоже, но строка там немного хитрого формата (перед ней идут доп поля). Дворды - с ними и так все ясно. Структуры тут самое сложное, их надо делить на части по 4 байта и запихивать частями.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #12  
Старый 22.10.2012, 21:37
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

ух) ладно, всем спасибо, пойду мучаться, возникну вопросы, отпишусь тут, но не сегодня уже наверно)
Ответить с цитированием
  #13  
Старый 23.10.2012, 11:36
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

сделал библиотеку с простенькой функцией, пробовал использовать ваш пример, но неудачно( значения в библиотеку приходят искажёнными

Код:
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  
Старый 23.10.2012, 11:40
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от reqyz
сделал библиотеку с простенькой функцией, пробовал использовать ваш пример, но неудачно( значения в библиотеку приходят искажёнными

Код:
Function SetFunction(dll,adress,param:string):boolean;
.....
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetFunction('Project2.dll','func','Boolean:1;Integer:10;PChar:rgtrhtyh;');
end;

что не так?(
А ты используешь библиотеку "BORLNDMM.DLL" ?
Ответить с цитированием
  #15  
Старый 23.10.2012, 11:45
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

в каком месте я её использую о_О, или как и зачем её использовать?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter