Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];

Вниз

Вызов процедур различной структуры без объявления типа???   Найти похожие ветки 

 
DeLz   (2004-02-19 09:12) [0]

Есть такая задачка:
Предположим в текстовом файле есть описание процедуры или функции, которая храниться либо в скомпилиной проге либо в dll. Какое-то событие должно вызвать данную процедуру или функцию, но единственное что знает событие о ней - это Имя и набор параметров.
И тут возникает вопрос а Как же все-таки запустить эту долбанную процедуру???


 
Defunct   (2004-02-19 09:18) [1]

Передавайте указатель на параметры.
Тогда у всех процедур будет одинаковое описание и способ вызова.

почитайте про TNotifyEvent.


 
Wild   (2004-02-19 09:27) [2]

Создай список из объектов примерно такого типа:

TProcedure = procedure (param: array of variant);

TProcObj = class
Name : string; //имя процедуры
Proc : TProcedure; // сама процедура
end;


Сделай список из таких объектов, заполни его. Когда надо будет вызвать какую-то процедуру - просто пробежись по списку и найди нужное имя и вызови


 
DeLz   (2004-02-19 09:31) [3]

И как это будет выглядеть примерно для такой структуры
в проге есть процедура
procedure CG(Owner:TComponent;Connect:TAdoConnection;tid,pid:integer);
Begin
//Что-то делаем
end;
Описание запуска в текстовом файле
CG,Self,ADO,1,2
Расшифровка записи
Имя процедуры,Переменная1,Переменная2,Переменная3,Переменная4
Где Каждая из переменных сначала должна искаться по имени в данном модуле (Например Self и Ado)
И как же это реализовать???
Заранее спасибо


 
DeLz   (2004-02-19 10:07) [4]

to Wild (19.02.04 09:27) [2]
Все конечно прекрасно, но как подставить в
Proc : TProcedure;
Адресочек моей процедуры


 
Тимохов   (2004-02-19 10:38) [5]

p: pointer;
p := адрес процедуры // получение адреса
proc := p; // присвоение
proc; // вызов


 
DeLz   (2004-02-19 11:24) [6]

to Тимохов © (19.02.04 10:38) [5]
- и отсюда вопрос - как на стадии загрузки программы получить адрес процедуры по имени???


 
Плохиш   (2004-02-19 11:29) [7]

>DeLz (19.02.04 11:24) [6]
[2]


 
Тимохов   (2004-02-19 11:29) [8]


> DeLz (19.02.04 11:24) [6]

В общем случае - никак. Регистрируй их парамаи - (адрес, имя).
Как-то вроде это можно делать для published методов в классах - я этого не делал, точно не знаю.


 
Юрий Зотов   (2004-02-19 11:30) [9]

> DeLz (19.02.04 11:24) [6]
> как на стадии загрузки программы получить адрес процедуры по
> имени???

Включить эту процедуру в export (это можно сделать и в Exe, и в DLL). Тогда ее адрес по имени можно получить через GetProcAddress.


 
Alex Konshin   (2004-02-19 11:33) [10]

C процедурами не знаю, скорее всего никак.
С методами, если они published, а еще лучше automated это можно.
Для методов из automated есть стандартный способ запуска, я на вскидку не скажу как, но он точно есть. Начинай копать с RttiInfo, либо подожди, сейчас кто-нибудь менее ленивый подскажет готовый рецепт.
С методами из published я помню какую-то проблему, вроде тип нельзя определить или у параметров не тип не опреелить - точно не помню.


 
AKul   (2004-02-19 12:34) [11]


> DeLz (19.02.04 09:12)
> Предположим в текстовом файле есть описание процедуры или
> функции, которая храниться либо в скомпилиной проге либо
> в dll. Какое-то событие должно вызвать данную процедуру
> или функцию, но единственное что знает событие о ней - это
> Имя и набор параметров.

Имя в откомпилированной программе???
Ладно если бы это был интерпретатор.
По Вашим описания - это даже не методы классов.
Можно конечно всякими изврантыми методами добиться этого (например, через отдладочную информацию), но зачем???
Из DLL можно получить адрес экспортируемой функции через GetProcAddress.
Передавать заранее неизвестное число параметров - можно опять же каким-нибудь извратным способом, например, ассемблерной вставкой - командой Push в цикле, (если, конечно, параметры передаются через стек), после чего сделать call на эту процедуру, после чего восстановить стек, если этого не делает вызываемая процедура. Или же, как уже писали, передавать указатель на структуру с этими параметрами.
Но опять же - зачем такие мучения???
Зачем Вам это нужно???

Может проще в текстовом файле хранить какие-нибудь идентификаторы этих процедур (пусть те же имена или индексы), а в программе делать вызов соответствующим этим идентификаторам процедур через CASE? И с параметрами в таком случае не будет проблем...


 
Юрий Зотов   (2004-02-19 12:50) [12]

> AKul © (19.02.04 12:34) [11]
> Из DLL можно получить адрес экспортируемой функции через
> GetProcAddress.

Из Exe - то же самое. В том числе, и из собственного Exe. Это и есть решения задачи (поскольку имя и набор параметров известны).


 
Тимохов   (2004-02-19 12:55) [13]

Имхо разницы нет - написать около каждой процедуры export или опять же каждую процедуру занести в массив записей (как в 2).


 
DeLz   (2004-02-19 13:24) [14]

Спасибо всем огромное!!!
Работаю через export - И GetProcAddress(Handle,ProcName)
Правда handle для своего exe ставиться в 0, я правильно понял???


 
Юрий Зотов   (2004-02-19 13:27) [15]

> DeLz (19.02.04 13:24) [14]
> Правда handle для своего exe ставиться в 0, я правильно
> понял???

Ставьте HInstance. Это уже готовая переменная.


 
DeLz   (2004-02-19 13:28) [16]

Еще раз огромное спасибо!!!


 
AKul   (2004-02-19 13:49) [17]


> Юрий Зотов © (19.02.04 12:50) [12]
> Из Exe - то же самое. В том числе, и из собственного Exe.

К чему это :( ?
Я вроде бы этого нигде этого не отрицал, а то что Вы писали в посте [9], на момент написания предыдущего поста, я не читал, прошу прощения за повтор.


> Это и есть решения задачи (поскольку имя и набор параметров
> известны).

Это, если все процедуры имеют одинаковое кол-во параметров(может, даже, одинаковые типы)!Тогда можно обойтись GetProcAddress и вызовом процедуры со считанными параметрами.
Но параметры зависят от имени функции. Придется анализировать имя, и все-равно, алгоритм придется ветвить (Будь то CASE, будь еще что....). Или же вопользоваться каким-нибуль "извратным" методом передачи переменного числа параметров.
А если "проанализировали" имя - мы на 100% знаем что это за процедура, и где она находится. Зачем же ее экспортировать? Зачем повторно находить ее адрес?

Да кроме того, зачем делать "лишний" экспорт (для EXE), если эти функции нужны только внутри приложения. Да и какой это подарок для крекеров!!!
А если функции расположены не тольков EXE-файле, но и в нескольких DLL? Дописывать дополнительно, откуда она экспортируется? Можно, конечно, а если не желательно дописывать "лишнюю" информацию?
По-моему, можно обойтись выборкой (определением) адреса процедуры по ее идентификатору внутри файла, а не через экспорт.
Но опять же - это всего лишь мое мнение.


 
DeLz   (2004-02-19 14:10) [18]

to AKul © (19.02.04 13:49) [11]
Может проще в текстовом файле хранить какие-нибудь идентификаторы этих процедур (пусть те же имена или индексы), а в программе делать вызов соответствующим этим идентификаторам процедур через CASE? И с параметрами в таком случае не будет проблем...
То-то и оно, что case жестко зашит в программе и если мы что-то не определили на этапе компиляции - пиши пропало
Еще хотелось бы основные процедуры прописать в самой программе - отладка легче чем с dll(во-всяком случае для меня)
Это, если все процедуры имеют одинаковое кол-во параметров(может, даже, одинаковые типы)!Тогда можно обойтись GetProcAddress и вызовом процедуры со считанными параметрами.
Нет все процедуры имеют разное кол-во параметров и разные типы
А в самой процедуре, которая export-ируется ведется анализ корректности переданных параметров (она-то знает что ей делать)
И ВСЕ - ВСЕ ВЕЛИКОЛЕПНО работает!!!


 
AKul   (2004-02-19 14:25) [19]


> DeLz (19.02.04 14:10) [18]
> То-то и оно, что case жестко зашит в программе и если мы
> что-то не определили на этапе компиляции - пиши пропало

Так и есть. Но, для того чтобы использовать какую-то новую функцию, ее все равно придется экспортировать.


> Еще хотелось бы основные процедуры прописать в самой программе

А какие проблемы то? Прописывайте.


> А в самой процедуре, которая export-ируется ведется анализ
> корректности переданных параметров (она-то знает что ей
> делать)

Вот с этого и надо было начинать, что функция передачи переменного числа параметров уже реализована.
Что все функции, которые Вы будете использовать (например, из других DLL) - написаны Вами (или хотя бы написаны "надсройки" над стандартными)

Тогда экпортируйте на здоровье...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.006 c
1-6032
denisf
2004-02-19 09:11
2004.03.03
Как подключить модуль


14-6244
VID
2004-02-09 23:27
2004.03.03
Два коннекта к интернету


1-6012
Серёга
2004-02-19 13:44
2004.03.03
RichEdit


6-6174
Eraszzer
2003-12-28 01:23
2004.03.03
Организация Proxy сервера.


6-6173
evgenius
2003-12-27 17:55
2004.03.03
Обмен данными в сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский