Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Дельфи. Как среди множества СОМ-объектов выбрать нужный?

Здравствуйте все,

Ситуация такая, на примере Word-а расскажу:
Загружено например 3 приложения Word-а, в одном из них мой документ.
Моя программа должна работать с этим документом через СОМ-интерфейсы
Word-а. Получается мне нужно подключить переменную и связать ее именно
с этим объектом Word-а, в котором открыт мой документ. Как это сделать
я не знаю, надеюсь на помощь.
ЗЫ. Нужно именно найти и соединиться с данным объектом.

Ответить   Thu, 6 Oct 2005 08:30:42 +0600 (#449791)

 

Ответы:

Здравствуйте, Шистеров,

Или как связать запущенное приложение с интерфейсом? Хендл приложения
есть, а вот как ассоциировать переменную с этим приложением?

Ответить   Thu, 6 Oct 2005 08:47:16 +0600 (#449799)

 

Добрый день Шистеров,

Thursday, October 6, 2005, 5:30:42 AM, вы писали:

Шистеров> Здравствуйте все,

Шистеров> Ситуация такая, на примере Word-а расскажу:
Шистеров> Загружено например 3 приложения Word-а, в одном из них мой документ.
Шистеров> Моя программа должна работать с этим документом через СОМ-интерфейсы
Шистеров> Word-а. Получается мне нужно подключить переменную и связать ее именно
Шистеров> с этим объектом Word-а, в котором открыт мой документ. Как это сделать
Шистеров> я не знаю, надеюсь на помощь.
Шистеров> ЗЫ. Нужно именно найти и соединиться с данным объектом.

Либо самому открывать нужный документ, либо пройтись по коллекции
документов и распознать по какому то признаку.

Ответить   Thu, 6 Oct 2005 14:43:19 +0300 (#450036)

 

Здравствуйте, Шистеров.

Вообще-то я не знаю, есть ли принципиальная разница в том, как именно
открывались документы - через один единственный экземпляр Ворда
через меню "Открыть", или же для каждого документа запускался новый
экземпляр Ворда. Мне кажется, что разницы в этих способах нет.
Впрочем, это можно проверить WinSight'ом.
А начал я не с того конца вот почему. Если почитать файл справки
vbawrd9, то обнаружится, что при подключении к Ворду через OLE и
вариантную переменную у этой переменной "появляются" такие поля

(WD :variant)
WD.Documents - коллекция открытых документов
WD.Documents.Count - число открытых док-тов
WD.Documents[i] - конкретный док.
WD.Documents[i].Name - имя его файла
WD.Documents[i].FullName - полный путь

Здесь, в принципе, и хэндл не нужен.

Так вот по поводу первого моего абзаца - я точно не знаю, если для
каждого документа запускать новый экземпляр Ворда, все равно ли для
них для всех создается одна единственная коллекция WD.Documents или
разные? Я думаю, что одна.

Ответить   Вадим Шешунов Thu, 6 Oct 2005 15:43:42 +0300 (#450343)

 

Здравствуйте, Вадим.

Вы писали 6 октября 2005 г., 18:43:42:

Насколько я знаю - одна копия. Запускается куча библиотек. Но каждая
естествено только в одном экземпляре. Для ворда хендел остается один.
А вот для каждого документа новый, т.к. это все же окно, хоть и
дочернее.

Ответить   Fri, 7 Oct 2005 01:03:50 +0600 (#450441)

 

Здравствуйте, Вадим,

Нда-а, похоже неудачный пример привел. Попробую по другому описать.

Вобщем так, есть некий внешний СОМ-сервер. Может работать как
самостоятельная программа, так и нет. Поэтому и выбран был пример
Ворда.
На момент использования этого сервера есть уже несколько запущенных
экземпляров. Один из которых нужный. Когда я использую функцию
подключения GetActiveOleObject - она возвращает первый экземпляр
СОМ-сервера. А как перебрать все экземпляры?
Первая мысль была перебирать по окнам, тогда есть Хэндлы. Отсюда и
определение экземпляра СОМ-сервера по Хэндлу.

З.Ы. Просьба не просить переделать некий СОМ-сервер. Он не мой.
З.З.Ы. Хотя попробую просмотреть на наличие документов, как-то я об
этом не задумался, но судя по параметрам это не поможет.

Ответить   Fri, 7 Oct 2005 09:08:00 +0600 (#450656)

 

Здравствуйте, Шистеров.

Да, в таком свете дело принимает другой оборот. Боюсь, не смогу
посоветовать что-либо конкретное, поскольку, во-первых, не знаю о
Вашем СОМ-сервере ровно ничего, а во-вторых, я с СОМ-серверами
практически не сталкивался, кроме как с программами Оффиса на уровне
OLE. Но пару соображений выскажу.
Во-первых, мне все-таки представляется, что экземпляров СЕРВЕРА один
единственный - просто к нему, так сказать, подключаются несколько
других клиентов, что ли - как в Ворде: есть сам Ворд (сервер), а доки
- это уже клиенты. (Понимаю, что выражаюсь в грубой терминологии).
Тогда сервер (сам Ворд) ведет учет всех клиентов (открытых докум.),
имея для этого соответствующюю коллекцию (считайте, каталог). Причем,
каждая единица этого каталога имеет свои значения свойств, хотя
список свойств и методов один и тот же. Здесь не нужны никакие хэндлы
- просто нужно докапаться до нужного члена коллекции. Проблема, каким
образом докапаватся. Если без документации к серверу с описанием
методов и свойств, то это практически гиблое дело. Хотя, еще раз
скажу, я не большой знаток СОМ.
Во-вторых, хэндлы окон тут не помогут, в смысле чтобы залезть в сам
какой-нибудь экземпляр. Не думаю, что если сделать нужное окно
передним, а потом вызвать GetActiveOleObject, то оно выдаст нужное.

Ответить   Вадим Шешунов Fri, 7 Oct 2005 17:12:04 +0300 (#451194)

 

Здравствуйте, Вадим,

Ну-у, сервер этот AutoCAD 2002, если это что-то говорит. Есть у него
коллекция документов, но работает не как Ворд, т.е. если есть
несколько приложений, то у каждого свои открытые документы.

Я тоже так думал, тогда получается, что как-бы сервер не работал
(Single? MultiInstance), он один экземпляр. Но покопавшись в MSDN по
поводу GetActiveObject обнаружил RunningObjectTable что натолкнуло на
мысль о существовании нескольких экземпляров. А вот дальше уже
глухо...

Документация есть, но... этот вопрос там не рассмаривается.

С передним окном был эксперимент - успеха не имел. GetActiveOleObject,
да и в описании написано, что использует первый. тут идея такая, что
если можно получить список объектов, то зная Хэндл, можно сравнивать с
Хэндлом, полученным из свойств сервера (есть у него такое свойство).

З.Ы. Кто может разложить работу с RunningObjectTable и прочими
интерфейсами по полочкам?

Ответить   Mon, 10 Oct 2005 08:29:30 +0600 (#452413)