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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.04.2007, 18:53
Shico Shico вне форума
Прохожий
 
Регистрация: 15.04.2007
Сообщения: 4
Репутация: 10
Восклицание DLL

Подскажите как вызвать dll, если ее имя, параметры (имя, количество) я узнаю уже во время работы программы?
Ответить с цитированием
  #2  
Старый 15.04.2007, 22:07
Аватар для X-rem
X-rem X-rem вне форума
Начинающий
 
Регистрация: 06.04.2007
Адрес: Питер
Сообщения: 119
Репутация: 10
По умолчанию

Да кса. Хороший вопрос. 5 баллов
__________________
[ Ты не сможешь никому помочь до тех пор, пока не поможешь себе ]
Delphi 7 user
  • Indy 10.5.5
  • AbfEffects & Controls
  • LockBox
  • AlphaControls
  • Eagle CDK

ICQ: 570224849 / JID: x-rem@jabber.ru|no / Skype: ukc-rem / VK: ukc_rem.vk.com (ID: 27703738)
Ответить с цитированием
  #3  
Старый 16.04.2007, 07:26
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Нормальный вопрос

Значит известно имя библиотеки (String) имя функции (String) и параметры функции: имя, количество (PChar,Integer).
Делается примерно так:
Код:
var
  hLib:THandle;
  testproc:procedure(aBuffer:PChar;aLength:Integer);stdcall;  //описание процедуры
begin
  hLib:=LoadLibrary('lib');  //тут имя библиотеки
  if hLib=0 then
    begin
      MessageDlg('Load library error!',mtError,[mbOk],0);
      Exit;
    end;
  @testproc:=GetProcAddress(hLib,'test');  //Тут имя процедуры
  if @testproc=nil then
     MessageDlg('Procedure not found',mtError,[mbOk],0)
  else  
     testproc(PChar(Edit1.Text),Length(Edit1.Text));  //Тут ее вызов
  FreeLibrary(hLib);
Ответить с цитированием
  #4  
Старый 17.04.2007, 22:52
Shico Shico вне форума
Прохожий
 
Регистрация: 15.04.2007
Сообщения: 4
Репутация: 10
По умолчанию

Хелпинг я тоже читать умею Все дело в переменных, я не знаю не количество, не имена, не типы. Точнее узнаю во время работы...

Последний раз редактировалось Shico, 17.04.2007 в 22:58.
Ответить с цитированием
  #5  
Старый 18.04.2007, 19:09
Аватар для mav_c
mav_c mav_c вне форума
Активный
 
Регистрация: 26.03.2007
Адрес: Москва
Сообщения: 287
Репутация: 30
По умолчанию

Цитата:
Сообщение от Shico
Хелпинг я тоже читать умею Все дело в переменных, я не знаю не количество, не имена, не типы. Точнее узнаю во время работы...
Нет, так нельзя? А зачем тебе это?
__________________
---------------------------------------------
Программирование - не профессия, а стиль жизни
Ответить с цитированием
  #6  
Старый 19.04.2007, 14:43
Аватар для Keygenmusic
Keygenmusic Keygenmusic вне форума
Активный
 
Регистрация: 24.10.2005
Адрес: Там
Сообщения: 201
Репутация: 20
По умолчанию

ну имя длл-ки и ф-ции узнаешь в процессе программы, поэтому через GetProcAddress получишь её адрес(указатель соответственно), потом, наверное, можно применить ассемблерную вставку, где в цикле с нужным кол-вом циклов делается push переменных и в конце call ProcAddress. допустим входные переменные пишем в массив var[i].
ну как-то так:
lea eax,var[0]
mov ecx, NumVars
loop1: push eax // в данном случае пушаться не сами переменные, а поинтеры на них. если надо сами переменные, то писать push [eax]
add eax,4 //4 байта размер интежера/дворда
loop loop1
call ProcAddress
//в еах будет лежать возвращенное ф-цией значение.

не отвечаю за работоспособность этого кода, т. к. слабо знаком с синтаксисом дельфовского ассемблера.

ЗЫ и правда 5 баллов за вопрос. хто найдёт как это без асма сделать - тот маладэц!
Ответить с цитированием
  #7  
Старый 20.04.2007, 07:20
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

В частном случае этот вариант в принципе возможен, в общем же это проблемы не решит. Если не знать какой тип у функции в dll'ке (cdecl, stdcall, safecall и т.д.), то можно на много граблей наступить.
Ответить с цитированием
  #8  
Старый 22.04.2007, 00:57
Аватар для Keygenmusic
Keygenmusic Keygenmusic вне форума
Активный
 
Регистрация: 24.10.2005
Адрес: Там
Сообщения: 201
Репутация: 20
По умолчанию

ну я думаю, что подрузамевается обычая функца типа винапи stdcall. можно ещё добавит код сохраняющий указатель на стек, а потом возвращающий его(стек) на место, на случай неправильного кол-ва пушей.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter