Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.102.225] |
|
Сообщ.
#1
,
|
|
|
Как можно избежать повторного открытия окна COM приложения? У мня есть программа, которая открывает документы в ворде, однако нужно, что бы уже открытый документ не открывался 2 раз. Как это сделать? Я так понимаю, нужно интеропнуть FindWindow. Нет ли способа попроще (желательно без interop)?
|
Сообщ.
#2
,
|
|
|
И в догонку, почему COM приложения всегда открываются заново, нельзя ли подключится к уже открытому экземпляру?
|
Сообщ.
#3
,
|
|
|
Цитата andrey, 10.09.03, 07:52:18 И в догонку, почему COM приложения всегда открываются заново, нельзя ли подключится к уже открытому экземпляру? Ну если это out-of-process сервер, то для этого существует ROT - Running Object Table в .NET поддержка осуществляется через интерфейс UCOMIRunningObjectTable |
Сообщ.
#4
,
|
|
|
Или еще можно через Marshal.GetActiveObject
|
Сообщ.
#5
,
|
|
|
Я так понимаю MSword и excel это out-of-process серверы?
|
Сообщ.
#6
,
|
|
|
Цитата andrey, 10.09.03, 12:43:51 Я так понимаю MSword и excel это out-of-process серверы? Ну конечно, это отдельные процессы. COM-серверы бывают: 1. dll in-process. Dll напрямую грузится в твой процесс 2. dll out-of-process. Для dll создается суррогатный процесс, ктр ее хостит. Используется редко, обычно если нужна повышенная безопасность 3. exe. out-of-process. Отдельные процессы, передача данных идет с помощью маршалинга. Это основы COM, хорошо описаны в книге Бокса "Essentials COM" Для out-of-process виндой создается специальная таблица - ROT, ктр содержит все запущенные экземпляры ассоциированные с их CLSID (ну или ProgId, если он задан). Остается мелочь - опросить ее на предмет нужного, получить инстанс если запущен и дергать методы |
Сообщ.
#7
,
|
|
|
Это понятно, а что с поиском уже открытых окон?
|
Сообщ.
#8
,
|
|
|
Цитата andrey, 11.09.03, 00:05:54 Это понятно, а что с поиском уже открытых окон? Аналога FindWindow в фреймворке нет. Глянь на этот wrapper может поможет |
Сообщ.
#9
,
|
|
|
То, что надо, спасибо!
|
Сообщ.
#10
,
|
|
|
О, нашёл способ ещё лучше!
Без разницы какой тип COM сервера: <br>public static Word.Application GetWord(){<br>try{<br>object o=System.RuntimeInteropServices.Marshal.GetActiveObject("Word.Application");<br>return (Word.Application)o;<br>}catch(System.Runtime.InteropServices.COMException){<br>//Какие-то глюки, скорее всего сервер не запущен<br>}<br>return new Word.ApplicationClass();<br>}<br> А по поводу уже открытого документа - проще всего получить уже запещенный ворд (GetActiveObject) и перебрать коллекцию Documents. только вот непонятно, что делать если документы открыты в разных процессах ворда. |
Сообщ.
#11
,
|
|
|
ну а о чем я писал в сообщении №3?
|