Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1123645641
Big Joe
2005-08-10 07:47
2005.11.20
Помогите с сокетом


3-1128684469
Weare
2005-10-07 15:27
2005.11.20
Сервер RPC недоступен


1-1130238930
Sergey_R
2005-10-25 15:15
2005.11.20
Самый быстрый способ сортировки массива


4-1126897036
Dot
2005-09-16 22:57
2005.11.20
слушать порт WinSocks


9-1120194150
@!!ex
2005-07-01 09:02
2005.11.20
Direct X Alpha Blending и VertexFog





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский