|
#1
|
|||
|
|||
DLL
Подскажите как вызвать dll, если ее имя, параметры (имя, количество) я узнаю уже во время работы программы?
|
#2
|
||||
|
||||
Да кса. Хороший вопрос. 5 баллов
[ Ты не сможешь никому помочь до тех пор, пока не поможешь себе ] Delphi 7 user
ICQ: 570224849 / JID: x-rem@jabber.ru|no / Skype: ukc-rem / VK: ukc_rem.vk.com (ID: 27703738) |
#3
|
||||
|
||||
Нормальный вопрос
Значит известно имя библиотеки (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
|
|||
|
|||
Хелпинг я тоже читать умею Все дело в переменных, я не знаю не количество, не имена, не типы. Точнее узнаю во время работы...
Последний раз редактировалось Shico, 17.04.2007 в 22:58. |
#5
|
||||
|
||||
Цитата:
--------------------------------------------- Программирование - не профессия, а стиль жизни |
#6
|
||||
|
||||
ну имя длл-ки и ф-ции узнаешь в процессе программы, поэтому через 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
|
||||
|
||||
В частном случае этот вариант в принципе возможен, в общем же это проблемы не решит. Если не знать какой тип у функции в dll'ке (cdecl, stdcall, safecall и т.д.), то можно на много граблей наступить.
|
#8
|
||||
|
||||
ну я думаю, что подрузамевается обычая функца типа винапи stdcall. можно ещё добавит код сохраняющий указатель на стек, а потом возвращающий его(стек) на место, на случай неправильного кол-ва пушей.
|