запуск Word.Application
От: vuder  
Дата: 14.06.05 07:48
Оценка:
Добрый день!
Подскажите есть ли возможность запустить сервер Word(CreateOleObject('Word.Application') ) так,
чтобы к нему можно было приконектиться только из моего приложения.
А открытие пользователем Word'a из винды приводило бы к созданию
нового процесса WINWORD.
Заранее спасибо!
Re: запуск Word.Application
От: ssm Россия  
Дата: 14.06.05 08:44
Оценка: -1
Здравствуйте, vuder, Вы писали:

V>Добрый день!

V>Подскажите есть ли возможность запустить сервер Word(CreateOleObject('Word.Application') ) так,
V>чтобы к нему можно было приконектиться только из моего приложения.
V>А открытие пользователем Word'a из винды приводило бы к созданию
V>нового процесса WINWORD.

сделать singleton, отдающий IDispatch единственного экзмпляра Word.Application

struct WordProxy
{
  IDispatch *getInstance() = 0;
};
Re[2]: запуск Word.Application
От: MaIron  
Дата: 31.03.08 12:36
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, vuder, Вы писали:


V>>Добрый день!

V>>Подскажите есть ли возможность запустить сервер Word(CreateOleObject('Word.Application') ) так,
V>>чтобы к нему можно было приконектиться только из моего приложения.
V>>А открытие пользователем Word'a из винды приводило бы к созданию
V>>нового процесса WINWORD.

ssm>сделать singleton, отдающий IDispatch единственного экзмпляра Word.Application


ssm>
ssm>struct WordProxy
ssm>{
ssm>  IDispatch *getInstance() = 0;
ssm>};
ssm>



Столкнулся точно с такой же проблемой. Нужно изолировать мой экземпляр Word от пользователей.

Объясните что такое сделать singleton – куда это вставить ???

Создаю Word так:


_Application objWord;

      // Convenient values declared as ColeVariants.
      COleVariant covTrue((short)TRUE),
                  covFalse((short)FALSE),
                  covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

      // Get the IDispatch pointer and attach it to the objWord object.
      if (!objWord.CreateDispatch("Word.Application"))
      {
         AfxMessageBox("Couldn't get Word object.");
         return;
      }

      objWord.SetVisible(FALSE);
Re[3]: запуск Word.Application
От: LMars Россия  
Дата: 01.04.08 02:18
Оценка:
Здравствуйте, MaIron, Вы писали:

MI>Столкнулся точно с такой же проблемой. Нужно изолировать мой экземпляр Word от пользователей.

MI>Объясните что такое сделать singleton – куда это вставить ???

Для решения этой проблемы singleton не поможет. И изолировать Word просто так нельзя... возможно гуру меня поправят.
Re[4]: запуск Word.Application
От: MaIron  
Дата: 01.04.08 04:16
Оценка:
Вообще проблема довольно распространённая. Но ответа я так и не нашёл.

Кто то предлагает открывать ещё одну копию Word для того что бы в неё загружался пользовательский документ.
Кто то предлагает удалять запись о текущем Word из таблицы приложений и т.д. ...
Re[5]: запуск Word.Application
От: izekia  
Дата: 01.04.08 07:40
Оценка:
Здравствуйте, MaIron, Вы писали:

MI>Вообще проблема довольно распространённая. Но ответа я так и не нашёл.


MI>Кто то предлагает открывать ещё одну копию Word для того что бы в неё загружался пользовательский документ.

MI>Кто то предлагает удалять запись о текущем Word из таблицы приложений и т.д. ...
а если запускать первоначальный вариант под другим пользователем?
Re[6]: запуск Word.Application
От: MaIron  
Дата: 02.04.08 05:59
Оценка:
Здравствуйте, izekia, Вы писали:

I>Здравствуйте, MaIron, Вы писали:


MI>>Вообще проблема довольно распространённая. Но ответа я так и не нашёл.



MI>>Кто то предлагает открывать ещё одну копию Word для того что бы в неё загружался пользовательский документ.


Делал. Непомогает. Т.к. Если пользователь откроет и закроет эту копию, а потом откроет ещё одну. То тогда всё рушится.


MI>>Кто то предлагает удалять запись о текущем Word из таблицы приложений и т.д. ...

I>а если запускать первоначальный вариант под другим пользователем?
Делал. Тоже как то не особо получилось... Почему именно не разбирался.

Сейчас пробую удалить Word из ROT но незнаю как получить DWORD код, для Revoke(?) — Там всего то и нужен один этот код.
Re[7]: запуск Word.Application
От: Vi2 Удмуртия http://www.adem.ru
Дата: 02.04.08 09:53
Оценка:
Здравствуйте, MaIron, Вы писали:

MI>Сейчас пробую удалить Word из ROT но незнаю как получить DWORD код, для Revoke(?) — Там всего то и нужен один этот код.


Не получится. Решение — сложное — в том, чтобы подписаться на события Word и отрабатывать их. Для Word у меня нет примера, но для Excel — есть.
Dim WithEvents ExcelApp As Excel.Application
Const workbookname As String = "c:\tmp\x.xls"

Private Sub ExcelApp_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean)
  Dim wb2 As Excel.Workbook
  If ExcelApp.Visible Then
    If UCase(Wb.FullName) = UCase(workbookname) Then
      Cancel = True
      ExcelApp.Visible = False
     
      '  Закрываем все остальные документы
      For Each wb2 In ExcelApp.Workbooks
        If Not wb2 Is Wb Then wb2.Close
      Next

    End If
  End If
End Sub

Private Sub Form_Load()
  Set ExcelApp = CreateObject("Excel.application")
  ExcelApp.Workbooks.Open workbookname
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Dim ea2 As Excel.Application, wb2 As Excel.Workbook
 
  Set ea2 = ExcelApp
  Set ExcelApp = Nothing
 
  If ea2.Workbooks.Count = 1 Then
    '  Закрываем приложение
    ea2.Visible = False
    ea2.Quit
  Else
    '  Закрываем только свой документ
    For Each wb2 In ea2.Workbooks
      If UCase(wb2.FullName) = UCase(workbookname) Then
        wb2.Close
        Exit For
      End If
    Next
  End If
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: запуск Word.Application
От: MaIron  
Дата: 02.04.08 12:46
Оценка:
Идея то в чём ? Я не пойму код что этот делает ?

Я могу подключиться к событиям MS Word, как своего так и текущего открытого.
Но что это мне даст ?

Как это поможе препядсвовать открытию документа пользователя в моём сервере автоматизации.

Создать ещё один сервер ? Но проблема в том, что его могут закрыть.
Можно это отследить, но дальше то что ? Создавать новый смылса нет.
Т.к. мой текущий активный сервер, перемиститься в ROT выше и именно к нему будут присасываться
оттрываемые пользователем документы...

Мда... Задачка от MS...
Re[9]: запуск Word.Application
От: Vi2 Удмуртия http://www.adem.ru
Дата: 02.04.08 13:01
Оценка:
Здравствуйте, MaIron, Вы писали:

MI>Идея то в чём ? Я не пойму код что этот делает ?


MI>Я могу подключиться к событиям MS Word, как своего так и текущего открытого.

MI>Но что это мне даст ?

Идея проста:
  1. создаешь Excel (Word) (смотри Form_Load),
  2. в нем открываешь свой документ (он не отображается и не будет отображаться для визуального пользователя) (смотри Form_Load),
  3. подключаешься к его событиям, отслеживая открытие/закрытие документов в твоем экземпляре Excel (Word) и не давая серверу закрыть твой документ (смотри Form_Load и ExcelApp_WorkbookBeforeClose),
  4. при завершении клиента корректно уничтожаешь твой экземпляр Excel (Word) (смотри Form_Unload).

MI>Как это поможет препятствовать открытию документа пользователя в моём сервере автоматизации.


Никак.

MI>Создать ещё один сервер ? Но проблема в том, что его могут закрыть.

MI>Можно это отследить, но дальше то что ? Создавать новый смысла нет.
MI>Т.к. мой текущий активный сервер, переместиться в ROT выше и именно к нему будут присасываться
MI>открываемые пользователем документы...

Другой сценарий, который может быть проще реализовать:
  1. создаешь первый экземпляр Excel (Word) — для открываемых пользователем документов, — который контролируешь и не даешь ему завершиться,
  2. создаешь второй экземпляр Excel (Word) — для своего приложения.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[10]: запуск Word.Application
От: MaIron  
Дата: 02.04.08 19:30
Оценка:

который контролируешь и не даешь ему завершиться

Каким образом не дать ему завершиться, когда пользователь закрывает документ ?
И я пишу на С++. Там многое иначе...
Re[11]: запуск Word.Application
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.08 03:38
Оценка:
Здравствуйте, MaIron, Вы писали:

MI>Каким образом не дать ему завершиться, когда пользователь закрывает документ ?


Событие DocumentBeforeClose имеет параметр Cancel для остановки закрытия документа и выгрузки сервера. Если Word не держится без документов, можно открыть и не закрывать свой фиктивный документ в нем.

MI>И я пишу на С++. Там многое иначе...


Иначе не значит не доступно.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[12]: запуск Word.Application
От: MaIron  
Дата: 03.04.08 03:51
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, MaIron, Вы писали:


MI>>Каким образом не дать ему завершиться, когда пользователь закрывает документ ?


Vi2>Событие DocumentBeforeClose имеет параметр Cancel для остановки закрытия документа и выгрузки сервера. Если Word не держится без документов, можно открыть и не закрывать свой фиктивный документ в нем.


MI>>И я пишу на С++. Там многое иначе...


Vi2>Иначе не значит не доступно.



А как скрыть документ ? По молчанию он показывается в развёрнутом виде.
Наверное через класс CWindow0 ? И метод put_Visible() ?
Re[13]: запуск Word.Application
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.08 09:21
Оценка:
Здравствуйте, MaIron, Вы писали:

MI>А как скрыть документ ? По умолчанию он показывается в развёрнутом виде.


А каким способом открывается документ? Я, конечно, досконально не знаю, какие там умолчания. Но помнится, если документ создается СОМ клиентом, то документ изначально невидим, если документ открывается конечным пользователем, то документ открывается видимым.

MI>Наверное через класс CWindow0 ? И метод put_Visible() ?


Наверное, способов масса, но в итоге идет обращение или к методу приложения (Application), показывая/скрывая все видимые окна приложения, или к конкретному окну документа (Window).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.