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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2009, 19:47   #11
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Цитата:
Сообщение от Роман Радер Посмотреть сообщение
Stilet, а вы знаете как иначе?

Мне не CallSomeFunc ассемблером вызвать надо!
Ладно объясню по-другому.
Есть dll. Программе задается число N - количество параметров.
N типов - типы параметров.
N значений - сами параметры.
Также, задается путь и имя к DLL и имя функции. Необходимо вызвать функцию.
Буду очень признателен.
Я чет не пойму... а почему нельзя просто передать в массиве сразу готовые параметры? потом в цикле каждый элемент поочередно положить в стек и вызвать функцию?
Д'якон вне форума Ответить с цитированием
Старый 18.02.2009, 20:35   #12
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

так в том и проблема что положить в стек нужно разные типы параметров и неизвестно как ложить разные типы.
и потом вызвать функцию.
Код:
call name
вот это name как писать, если оно в переменной?
Роман Радер вне форума Ответить с цитированием
Старый 18.02.2009, 21:58   #13
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Роман Радер Посмотреть сообщение
Код:
call name
вот это name как писать, если оно в переменной?
Ну, положим это не проблема. Адрес по имени мы всегда сможем получить:

Код:
   h := GetModuleHandle('GDI32');
   P := GetProcAddress(h, 'GetTextAlign');
А вот вторая часть...

Цитата:
так в том и проблема что положить в стек нужно разные типы параметров и неизвестно как ложить разные типы.
и потом вызвать функцию.
При большом желании с порядком помещения параметров в стек разобраться можно. Можно посмотреть как сделан ObjectInvoke() из unit ObjAuto и сделать по аналогии.

Только как Вы будете контролировать соответствие переданных параметров значениям, нужным в dll ?. Все равно придется обрабатывать какие-то заголовочные файлы. (Это, наверное, для использования API в Вашем языке ?)
alexBlack вне форума Ответить с цитированием
Старый 18.02.2009, 22:07   #14
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Все равно придется обрабатывать какие-то заголовочные файлы.
да нет, это не проблема. как-нибудь с этим разберусь. а вот по поводу объекта можно поподробнее? что это за модуль такой?
да, вы правильно поняли. это для моего языка. не только для API, для поддержки сторонних функций кроме встроеных.
с адресом функции действительно не проблема.
с целыми числами - тоже.
а вот с плавающей точкой и double - ужас один. как оно его в стек ложит?! там 4 push'a и последний - 1 байт какой-то. непонятно откуда берется. это для real. (смотрел CPU при трассировке)
Роман Радер вне форума Ответить с цитированием
Старый 18.02.2009, 22:17   #15
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

С double (для stdcall) особых проблем нет. Вот модель register, действительно непонятна. Вот здесь я выкладывал код для вызова метода с передачей параметров. Потом нашел вариант проще.

Код:
type
   {$METHODINFO ON}
   TMyClass = class
   published
      function test4(N:integer; S:String):String;
   end;
   {$METHODINFO OFF}

function TMyClass.test4(N:integer; S:String):String;
begin
   Writeln(S);
   Writeln(N);
   result := 'test string';
end;

var C:TMyClass;
    M:PMethodInfoHeader;
    P:PTypeInfo;
    V:Variant;
begin
   C := TMyClass.Create;
   try
      M := GetMethodInfo(C, 'test4');
      if M <> nil then begin

         V := ObjectInvoke(C, M, [1, 2], [55, 'string']);
         writeln(V);

      end;
   finally
      C.Free;
   end;
Смысл в следующем:
GetMethodInfo - возвращает структуру - описание параметров, возвращаемого значения и модели вызова. Вот эту часть нужно будет сделать из описания метода в dll.

Дальше просто - передаем описание в invoke и метод выполняется. Там в исходниках видно как заполняется стек и делается вызов. В принципе, его можно просто подправить под вызов процедуры вместо метода объекта.

Последний раз редактировалось alexBlack; 18.02.2009 в 22:22.
alexBlack вне форума Ответить с цитированием
Старый 18.02.2009, 23:27   #16
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Цитата:
Сообщение от Роман Радер Посмотреть сообщение
так в том и проблема что положить в стек нужно разные типы параметров и неизвестно как ложить разные типы.
и потом вызвать функцию.
Код:
call name
вот это name как писать, если оно в переменной?
В стек меньше dword не положешь. А любой тип - это либо указатель на буфер или значение - не вижу проблем
И зачем call name, если есть GetProcAddress
Д'якон вне форума Ответить с цитированием
Старый 18.02.2009, 23:45   #17
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В общем случае надо знать типы параметров. Например, вещественное число в array of const всегда будет extended, и уже нельзя будет узнать, передавать его функции как single, double или extended. Если известно, что параметры только, например, integer, double, boolean, char, pchar, то вроде никаких особых проблем не видно.
Somebody вне форума Ответить с цитированием
Старый 19.02.2009, 08:10   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

От проблему нашли, Рома, а не скажеш ли нам что это за ДЛЛ такая, что ну никак к ней не подступишся, а?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.02.2009, 12:07   #19
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
В общем случае надо знать типы параметров. Например, вещественное число в array of const всегда будет extended, и уже нельзя будет узнать, передавать его функции как single, double или extended. Если известно, что параметры только, например, integer, double, boolean, char, pchar, то вроде никаких особых проблем не видно.
ну можно и переделать структуру array of const, например,
Код:
array of record
  v:variant;
или
a:integer;
b:real;
c:double;
...
end;
хотя это тупо...главное суть.

Цитата:
Сообщение от Stilet Посмотреть сообщение
От проблему нашли, Рома, а не скажеш ли нам что это за ДЛЛ такая, что ну никак к ней не подступишся, а?
я ведь писал уже
Цитата:
для API, для поддержки сторонних функций кроме встроеных.
сижу сейчас, пытаюсь разобраться в модуле ObjAuto. капец. это хуже ассемблера)
Роман Радер вне форума Ответить с цитированием
Старый 19.02.2009, 12:16   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
для API, для поддержки сторонних функций кроме встроеных.
Ты знаеш какие параметры эти функции принимают?
SDK на них есть?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и вызов библиотеки dll DM_bite Помощь студентам 3 15.06.2010 12:47
Вызов функции MarSeON PHP 2 01.08.2008 20:22
вызов из dll не ShowModal. Roof Общие вопросы Delphi 7 25.07.2008 15:22
Автоматический вызов функции класса Flaton Общие вопросы C/C++ 4 19.10.2007 17:56
Вызов функции по таймеру Lexicss Общие вопросы Delphi 4 30.05.2007 22:47