Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функций и процедур, только по адресу и описанию... 
:(
    Опции темы
lukas
Дата 29.3.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Так, у меня не первый подобный вопрос... теперь же я задам его конкретнее...

 Задача такая, вообще есть ссылка Ptr: Pointer на функцию или процедуру (значения не имеет), есть значения Параметров, есть описания типов параметров фун/проц... Нужно ее вызвать хотябы одним из способов (stdcall, register,pascal и т.д.)

 Вообщем более менее я смог вызвать процедуру и функцию stdcall и register методом, но есть некоторые сложные вещи.

В кратце:

Код


Const
 varBase      = 1000;
 varPChar     = varBase + 1;
 varPWideChar = varBase + 2;

Type
 UnitProc = record
  Name: String[255];
  Ptr: Pointer;
  ParamTypes: Array of Word;
end;


Var
 Proc     : Array of UnitProc;

procedure ProcEx;
 var
  F: Pointer;
  Arr: Array of Variant;
  tmp: String;
  Res: String;

  _S: String;
  _I: Integer;
  _SN: Single;
  _D1,_D2: Single;
  _P: PChar;
  _W: Word;
  _LW: LongWord;
  _Dt: TDateTime;
  _sI: Shortint;

  VType: Word;
  Value: String;
begin

 SetLength(Arr,Len);

   for i := len downto 1 do
    begin
     Value := ParseStr(PR[I]);
     VType := Proc[K].ParamTypes[i-1];
{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^}
case VType of
 varString: begin
              _S := Value;
              asm
               push _s;
              end;
            end;
 varInteger: begin
              _I := StrToInt(Value);
              asm
               push _i;
              end;
             end;
 varSingle:  begin
              _SN := StrToFloat(Value);
              asm
               push _SN;
              end;
             end;
 varPChar  : begin
              _P := PChar(Value);
               asm
                push _P;
               end;
             end;
 varDouble : begin
               asm
                 // вот тут проблема...
               end;
             end;
 varWord   : begin
              _W := StrToInt(Value);
               asm
                push _W;
               end;
              end;
 varLongWord: begin
              _LW := StrToInt(Value);
               asm
                push _LW;
               end;
              end;
 varShortInt: begin
               _sI := StrToInt(Value);
                asm
                 push _sI;
                end;
              end;  
 end;
{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^}

    // AddStack(tmp,i-1,Proc[k].ParamTypes[i-1]);
    end;

 F := Proc[K].Ptr;
 
    asm
     call F;
    end;
end;


Так вот... таким способом я запихиваю параметры в стек для вызываемой процедуры stdcall,... проблема в передачи в стек больших типов (например Double и т.д), которые нужно передавать иным способом... В асм я не силен, поэтому...  smile 

При декомпиляции в делфи я заметил, что ,например, если класть в стек double число, то делфи это делит на 2 части
Код

 push <???>
 push <???>


Если же класть типы <= 4 байтам то проблем нет... 
Как делить и что делать я не понимаю...  smile  smile 




--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Esperito
Дата 29.3.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: 1
Всего: 3



Вот я пример написал, попробуй:

Код

procedure PD(D: Double);
begin
  Form1.Caption := FloatToStr(D);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  D: Double;
  I: Int64Rec absolute D;
  C1, C2: Cardinal;
begin
  D := 1.1;
  C1 := I.Cardinals[0];
  C2 := I.Cardinals[1];

  asm
    push C2
    push C1
    call PD
  end;
end;


Это сообщение отредактировал(а) Esperito - 29.3.2008, 22:34
PM MAIL   Вверх
lukas
Дата 30.3.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Esperito

спасибо... уже нашел сам способ... более красивый...

Код

procedure PD(D: Double);
begin
  Form1.Caption := FloatToStr(D);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  D: Double;
begin
  D := 1.1;
  asm
    push dword ptr[D+$0004]
    push dword ptr[D]
    call PD
  end;
end;


Смещение на 4 байта... в стек пихаем задом наперед если через stdcall ..  smile 


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1009 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.