На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Повторное открытие окна
    Как можно избежать повторного открытия окна COM приложения? У мня есть программа, которая открывает документы в ворде, однако нужно, что бы уже открытый документ не открывался 2 раз. Как это сделать? Я так понимаю, нужно интеропнуть FindWindow. Нет ли способа попроще (желательно без interop)?
      И в догонку, почему COM приложения всегда открываются заново, нельзя ли подключится к уже открытому экземпляру?
        Цитата andrey, 10.09.03, 07:52:18
        И в догонку, почему COM приложения всегда открываются заново, нельзя ли подключится к уже открытому экземпляру?

        Ну если это out-of-process сервер, то для этого существует ROT - Running Object Table
        в .NET поддержка осуществляется через интерфейс UCOMIRunningObjectTable
          Или еще можно через Marshal.GetActiveObject
            Я так понимаю MSword и excel это out-of-process серверы?
              Цитата 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, если он задан). Остается мелочь - опросить ее на предмет нужного, получить инстанс если запущен и дергать методы
                Это понятно, а что с поиском уже открытых окон?
                  Цитата andrey, 11.09.03, 00:05:54
                  Это понятно, а что с поиском уже открытых окон?

                  Аналога FindWindow в фреймворке нет. Глянь на этот wrapper может поможет :)
                    То, что надо, спасибо!
                      О, нашёл способ ещё лучше!
                      Без разницы какой тип COM сервера:
                      ExpandedWrap disabled
                        <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. только вот непонятно, что делать если документы открыты в разных процессах ворда.
                        ну а о чем я писал в сообщении №3?
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,1090 ]   [ 16 queries used ]   [ Generated: 28.04.24, 06:22 GMT ]