Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 20:09   #1
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию универсальная загрузка 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;
это то что я наклепал, я никак не могу решить праблу внутренних параметров(((( глаза уже мутные и мозг плавится, кто подскажет... помогите, всё что плохо обьяснил спросите, отвечу как смогуууу
Biohazard вне форума Ответить с цитированием
Старый 22.10.2012, 21:07   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
stdcall
Почему именно?
eval вне форума Ответить с цитированием
Старый 22.10.2012, 21:13   #3
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
Почему именно?
ну условие задания такое, но если и это можно универсальным сделать, наверно лучше
Biohazard вне форума Ответить с цитированием
Старый 22.10.2012, 21:16   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

ясна
а в чем конкретно проблема? прога компилится?
eval вне форума Ответить с цитированием
Старый 22.10.2012, 21:19   #5
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

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

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

integer 8
string 'thtyhty'
byte true

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

на одном форуме дали к размышлению, но пока не знаю что делать если в параметрах и строки и целые и дробные и булеан будет, в общем тут весь тупик
Biohazard вне форума Ответить с цитированием
Старый 22.10.2012, 21:45   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Здается мне что без асемблера тут не обойтись...
eval вне форума Ответить с цитированием
Старый 22.10.2012, 22:25   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Придется тебе вручную параметры в стек класть и вызывать функцию. Тогда и calling convention универсальным можно сделать, да. И, действительно, без ассемблерных вставок не обойтись.

Почитай про то, как работает передача параметров в функции для начала.
Son Of Pain вне форума Ответить с цитированием
Старый 23.10.2012, 11:54   #8
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

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

Код:
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;
Biohazard вне форума Ответить с цитированием
Старый 23.10.2012, 13:32   #9
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

В эксп.функии func() в составе Project2.dll какое соглашение о вызове декларировано ?
xoodoo вне форума Ответить с цитированием
Старый 23.10.2012, 20:21   #10
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
В эксп.функии func() в составе Project2.dll какое соглашение о вызове декларировано ?
Код:
Function func(a:boolean;b:integer;g:PChar):HINST;
begin
  if(a)then
    b:=b-3;
end;

exports func;
begin

end.
Biohazard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка компонент из DLL Hottabych Компоненты Delphi 0 13.02.2011 16:18
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
Загрузка dll Колючка* Общие вопросы Delphi 3 12.02.2010 19:45
загрузка .dll blackstersl Общие вопросы Delphi 1 29.04.2009 21:53
Загрузка DLL Hollander Общие вопросы Delphi 3 21.05.2007 20:19