Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
ВнизВозможна ли передача коннекта в COM объект? Найти похожие ветки
← →
Tyo (2002-11-29 21:04) [0]Помогите советом, плз.
Я написал COM-объект, в котором имеется форма, а на ней -- запрос ADOQuery. При вызове COM-объекта в нем устанавливается коннект для этого запроса, и дальше все работает нормально.
Однако в программе, вызывающей этот COM, уже существует установленный коннект ADOConnection, и очень хотелось бы его передать в COM в качестве параметра Connection для тамошнего запроса ADOQuery, чтобы не тратить время и не устанавливать два параллельных коннекта.
Ничего похожего в типах параметров для интерфесов COM я не нашел.
Итак -- можно ли сделать вышеуказанное, и если да, то как?
Заранее спасибо.
← →
asmith (2002-11-29 21:34) [1]Можно. Пусть, например, ты добавил к интерфейсу метод инициализации коннекции:
function InitConnectionInCOM(AppConnection: Integer): HResult; stdcall;
Далее создаешь ссылку на объект и инициализируешь коннекцию:
myCOM := CreateComObject(...);
myCOM.InitConnectionInCOM(dmApp.conApp));
т.е. передаешь в свой объект ссылку на существующую и уже открытую главной апликацией коннекцию (TADOConnection)
В COM-объекте создаешь экземпляр внутреннего объекта и присваиваешь ему ссылку на коннекцию:
function TMyCOM.InitConnectionInCOM(AppConnection: Integer): HResult;
begin
conCOM := TAdoConnection(SomeParent);
conCOM := TAdoConnection(AppConnection);
end;
где SomeParent может быть ссылкой на форму или еще чего-нибудь или вообще nil (тогда прибить обязательно руками!).
Теперь цепляй на conCOM свои ADOQuery и что тебе нужно.
← →
Набережных С. (2002-11-29 23:39) [2]Создаешь в COM-объекте связку ADOConnection+ADOQuery. Передаешь в него интерфейс _Connection(свойство ConnectionObject зкземпляра ADOConnection в EXE). Присваиваешь этот интерфейс свойству ConnectionObject зкземпляра ADOConnection в COM-объекте. Работай на здоровье. А указатели на объект передавать не следует, даже если объект в DLL.
← →
asmith (2002-11-30 17:43) [3]>А указатели на объект передавать не следует
А чем это грозит? Делаю такие вещи достаточно давно, еще со времен D2, побочных эффектов не наблюдал. Правда, не допускаю какой-либо модификации переданного объекта. А в журнальных статьях видел кучу примеров передачи с модификацией. Например, апликация передает в DLL TMainMenu и там оно модифицируется.
← →
Набережных С. (2002-11-30 19:07) [4]Ну использовали - и славненько. Проблемы, как помнится, были связаны с межапартаментным взаимодействием и не только. Подробностей я уже не помню и не имею никакого желания вспоминать. Так что можно считать, что аргументов у меня нет.
P.S. А какое отношение к этому имеет TMainMenu я вообще не понял.
← →
asmith (2002-11-30 19:19) [5]Это просто для точности - не далее, как вчера видел этот пример в статье. Меня это удивило - всегда полагал, что передавать созданный в апликации объект в DLL и там модифицировать - не рекомендуется. Особенно, если не собирается все с runtime packages.
← →
Fantasist (2002-11-30 21:16) [6]
> Меня это удивило - всегда полагал, что передавать созданный
> в апликации объект в DLL и там модифицировать - не рекомендуется
Почему не реккомендуется? Конечно, если ты плохо представляешь иерархию объектов и их взаимодействие то можно напороться на глюки, однако если же ты хорошо представляешь то что модифицируешь, то проблем не вижу. Не важно какой код изменит объект, важно как это отразиться на связанных объектах.
С COM я бы тоже предпочел передавать интерфейсы вместо указателей на объекты. Самое главное чтобы с подсчетом ссылок все было ок, но Дельфийский компилятор с этим не плохо справляется.
← →
Набережных С. (2002-11-30 21:42) [7]Да просто я энное время назад наступал на эти грабли в некоторых ситуациях и пришел к выводу, что лучше этого избегать, чем тратить время на борьбу с побочными эффектами. А подробностей я ,честно слово, не помню:). И вполне допускаю, что в других случаях все будет нормально. Но сам я так не делаю, а потому и другим рекомендовать не могу. А в меню, если я правильно помню, все замыкается на посылку сообщений на его хендл, так что его можно менять хоть откуда(вероятно:)).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c