Форум: "Основная";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизКак загруженной DLL выполнить Функцию (метод) основной программы? Найти похожие ветки
← →
Alex_Mel (2005-10-28 15:33) [0]Здравствуйте.
Программа загружает библиотеку, которая при поступлении опред. события должна выполнить функцию, которая находится в основной программе. Как это реализовать?
← →
isasa © (2005-10-28 15:46) [1]Программа загружает библиотеку, которая при поступлении опред. события должна выполнить функцию, которая находится в основной программе
Это как? Библиотека имеет много точек входа.
← →
Reindeer Moss Eater © (2005-10-28 15:49) [2]callback
← →
TUser © (2005-10-28 15:52) [3]Библиотека
unit uMyUnit;
interface
type
TMyProc = procedure (V: integer);
implementation
end.
library Project1;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library"s USES clause AND your project"s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
uMyUnit in "uMyUnit.pas";
{$R *.res}
procedure Test (Proc: TMyProc);
begin
Proc (5);
end;
exports Test;
begin
end.
Программа
uMyUnit - тот же
иprocedure Test (Proc: TMyProc); external "Project1.dll";
procedure ThisProc (V: integer);
begin
ShowMessage(inttostr(V));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Test (ThisProc);
end;
← →
Джо © (2005-10-28 15:54) [4]Или использовать механизм callback-вызовов (в том или ином виде), либо использовать механизм сообщений Windows. Можно и еще что-то экзотческое придумать, сейчас в голову не приходит. Ну, до кучи, ещи и возможности COM можно, вероятно, использовать.
Нужно более подробное описание конкретной задачи.
← →
Alex_Mel (2005-10-28 15:54) [5]Это как? Библиотека имеет много точек входа
Не понял.
Смысл в том, что DLL реагирует на событие операционной системы. Как только оно произошло, в ней срабатывает функция, которая в свою очередь должна, свой результат передать как аргумент другой ф-ии, но уже в главной программе.
Можно конечно по таймеру проверять, а не вернула ли у нас что-нить Dll, но хотелось бы, чтобы DLL сама запустила ее в нужный момент. Так понятно? :)
← →
Джо © (2005-10-28 15:55) [6]Да, самое главное. Недостаточно просто "загрузить библиотеку".
← →
Джо © (2005-10-28 15:57) [7][5] Alex_Mel
> Так понятно? :)
Так понятно. Хотим невозможного.
← →
Alex_Mel (2005-10-28 15:59) [8]>> Джо © Да, ладно, не надо обижаться ;) мне ж интересно возможно ли это в принципе</I
>>> TUser © А вот это мысль. Спасибо!
← →
Leonid Troyanovsky © (2005-10-28 16:05) [9]
> Alex_Mel (28.10.05 15:54) [5]
> Смысл в том, что DLL реагирует на событие операционной системы.
> Как только оно произошло, в ней срабатывает функция, которая
> в свою очередь должна, свой результат передать как аргумент
> другой ф-ии, но уже в главной программе.
> Можно конечно по таймеру проверять, а не вернула ли у нас
> что-нить Dll, но хотелось бы, чтобы DLL сама запустила ее
> в нужный момент. Так понятно? :)
Смутное подозрение, что оная dll работает в контексте другого процесса.
А если так, то способы передачи данных лежат в области IPC.
Скорее всего, у ей д.б. некий COM интерфейс, который и следует
внимательнейшим образом поискать.
--
Regards, LVT.
← →
Digitman © (2005-10-28 16:12) [10]
> Alex_Mel (28.10.05 15:54) [5]
у тебя в голове каша из обрывочных сведений о DLL.
советую разобрать эту кашу.
← →
Leonid Troyanovsky © (2005-10-28 16:14) [11]
> Alex_Mel (28.10.05 15:59) [8]
> >>> TUser © А вот это мысль. Спасибо!
А.. Так это собс-ный dll, и он в собс-ном хосте.
Тогда, все просто.
Своим вызовом хост регистрирует свои обработчики, которые
будут выполнятся при наступлении интересующего события.
А библиотека, при наступлении события, проходит по списку
зарегистрированных обработчиков и вызывает их, передавая
необходимые параметры.
--
Regards, LVT.
PS Правда, не совсем понятно, почему хост не мог сам реагировать
на оные события.
← →
Alex_Mel (2005-10-28 16:21) [12]Leonid Troyanovsky © Так-так, не так быстро.
Своим вызовом хост регистрирует свои обработчики, которые
будут выполнятся при наступлении интересующего события.
А библиотека, при наступлении события, проходит по списку
зарегистрированных обработчиков и вызывает их, передавая
необходимые параметры
Как зарегистрировать обработчики, которые библиотека потом УВИДИТ???
Можно маленький примерчик? а-то туговато доходит.
← →
ANB © (2005-10-28 16:35) [13]
> Alex_Mel (28.10.05 16:21) [12]
После загрузки DLL в основном модуле вызвать из нее какую нибудь процедуру инициализации, в которую нужно передать информацию о нужных функциях и объектах (их адреса). Прототипы функций в DLL объявить заранее. Потом из DLL сможешь вызывать все что передал. Проблема если DLL ты внедрил в чужое АП. Тогда придется изгаляться с проецируемыми в память файлами или передавать нужную инфу сообщениями. В этом случае напрямую вызвать будет ничего нельзя, но можно объявить свои сообщения, а в основной программе встроить их обработку в цикл обработки сообщений какого нибудь окна.
← →
ANB © (2005-10-28 16:36) [14]Для примера нужно уточнение - в своем или чужом АП работает твоя DLL.
← →
Leonid Troyanovsky © (2005-10-28 16:40) [15]
> Alex_Mel (28.10.05 16:21) [12]
> Как зарегистрировать обработчики, которые библиотека потом
> УВИДИТ???
Постой-постой, тут у нас тоже вопросы накопились.
Надобность в вопрошаемом может возникнуть в следующих случаях:
1. dll работает и в другом процессе;
2. в dll работает вторичный поток;
3. dll субклассирует некую оконную процедуру хоста.
Каждый из этих случаев имеет свои особенности, так, что
для начала, надо определится.
Ну, и вопрос личный: почему искомое нельзя было сделать из exe.
--
Regards, LVT.
← →
Alex_Mel (2005-10-28 16:43) [16]>>ANB © В своем. Схема в принципе понятна, TUser в начале предложил. Ее навернуть, и получится то, о чем вы говорите. Так ведь?
← →
Alex_Mel (2005-10-28 16:46) [17]Leonid Troyanovsky Да можно и из exe, тогда вообще без проблем. Только задача так поставлена. Эта Dll должна быть.. ну типа - плагином...да, так и есть. Работает все в одном АП. и прогу и DLL писать сам буду.
← →
Leonid Troyanovsky © (2005-10-28 16:51) [18]
> Alex_Mel (28.10.05 16:46) [17]
> Leonid Troyanovsky Да можно и из exe, тогда вообще без проблем.
> Только задача так поставлена. Эта Dll должна быть.. ну
> типа - плагином...да, так и есть. Работает все в одном АП.
> и прогу и DLL писать сам буду.
Во-первых, из трех вариантов исключен лишь один.
Во-вторых, IMHO, dll в классическом виде - хреновый кандидат на плагин.
Это д.б. ActiveX или иной COM в лучшем случае, ну, а если все делается
собс-ручно, то .bpl - на худой конец.
--
Regards, LVT.
← →
Alex_Mel (2005-10-28 16:54) [19]>>Это д.б. ActiveX или иной COM в лучшем случае, ну, а если все делается
собс-ручно, то .bpl - на худой конец
Увы, как оперировать ни с одним из них не представляю. Да и постановщики требуют именно Dll, им не объяснишь :). Так что выбора нет.
← →
Джо © (2005-10-28 16:57) [20][18] Leonid Troyanovsky © (28.10.05 16:51)
> Во-вторых, IMHO, dll в классическом виде - хреновый кандидат
> на плагин.
Понятие "хреновости", конечно, субъективно. Но, все-же - чем навеяна такая характеристика?
← →
clickmaker © (2005-10-28 17:00) [21][18] Leonid Troyanovsky © (28.10.05 16:51)
> Во-вторых, IMHO, dll в классическом виде - хреновый кандидат
> на плагин.
Я тоже не согласен. Почему зуб на длл?
← →
Leonid Troyanovsky © (2005-10-28 17:01) [22]
> Alex_Mel (28.10.05 16:54) [19]
> Увы, как оперировать ни с одним из них не представляю. Да
> и постановщики требуют именно Dll, им не объяснишь :). Так
> что выбора нет.
От расширения (имени) мало чего зависит.
Построенные плагины вполне могут зваться .dll, бо, таковыми
они по сути и являются.
А вот с остальным (представлением), тут нужно RTFM,RTFM и RTFM.
Надеюсь, что нужное напрвление тебе здесь придадут.
Ну, а так - google тебе в руки.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-10-28 17:17) [23]
> > Во-вторых, IMHO, dll в классическом виде - хреновый кандидат
> Джо © (28.10.05 16:57) [20]
> Понятие "хреновости", конечно, субъективно. Но, все-же -
> чем навеяна такая характеристика?
> clickmaker © (28.10.05 17:00) [21]
> Я тоже не согласен. Почему зуб на длл?
Речь идет о классическом PE, который умеет работать с лишь простыми
типами данных. Положение также усугубляется самой VCL, используещего
n-ое число глобальных переменных (в секции implementation, да простят
меня пуристы).
А плагины, IMHO, это нечто расширяющее функциональность (или еще
что-то там еще) базовой программы, которые естественно укладываются
в некое подмножество OOP, и, соответственно, требует гораздо более
изощренных типов данных, как, собс-но, и методов их обработки.
Кроме того, если уж речь зашла о плагинах, мы не должны ограничивать
себя одними дельфийскими приложениями (иначе, самым лучшим способом
было б написание всего в одном флаконе).
Можно б, конечно, продолжить, но, IMHO, все это уже было не раз
говорено и, возможно, набило оскомину.
--
Regards, LVT.
← →
Джо © (2005-10-28 17:25) [24]
> Кроме того, если уж речь зашла о плагинах, мы не должны
> ограничивать
> себя одними дельфийскими приложениями
Тогда непонятен совет использовать package library.
← →
Leonid Troyanovsky © (2005-10-28 17:29) [25]
> Джо © (28.10.05 17:25) [24]
> > ограничивать
> > себя одними дельфийскими приложениями
> Тогда непонятен совет использовать package library
Ну, это ж на (самый) худой конец.
--
Regards, LVT.
← →
isasa © (2005-10-28 17:32) [26]У меня сильное подозрение, что речь идет о COM+ Events.
← →
Leonid Troyanovsky © (2005-10-28 17:37) [27]
> isasa © (28.10.05 17:32) [26]
> У меня сильное подозрение, что речь идет о COM+ Events.
IMHO, выяснялось, что + & Events можно даже опустить.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.085 c