Создать эксклюзивный экземпляр слова - PullRequest
5 голосов
/ 21 сентября 2010

Я создаю экземпляр word (14) с взаимодействием из приложения winforms c # .net4 для работы с документом. Если какой-либо текстовый документ будет открыт за пределами моего приложения, будет использован тот же экземпляр слова, что нарушит работу моего приложения.

Простой вопрос : Есть ли способ установить экземпляр моего слова эксклюзивным для моего приложения?

Заранее спасибо.

Кстати: нашёл кое-что с эксклюзивным / word / office / isolated / block / instance, но без ответов.

Ответы [ 2 ]

7 голосов
/ 17 октября 2010

Есть своего рода решение, но оно не очень красивое.Основная проблема заключается в том, что Word регистрируется в ROT (таблица запущенных объектов), и тогда другие приложения могут легко получить доступ к экземпляру Word, зарегистрированному в ROT (именно это делает, например, функция VB GetObject).

Итак, в вашем приложении вам в основном нужно сделать 2 вещи

  1. Попробуйте GetObject (то есть запросите ROT для работающего экземпляра)
  2. Если он у вас есть, вы знаете, что ДОЛЖНЫ создать новый экземпляр Word для использования ( CreateObject в VB, процесс отличается от других языков).
  3. Если вы НЕ делаетеполучить один, вы должны создать 2 новых экземпляра Word.Первый автоматически зарегистрируется в ROT, второй - нет.Используйте второй экземпляр и совсем первый экземпляр.

Даже если вы прервете этот первый экземпляр, он не будет «задним числом» регистрироваться в ROT, а другие приложения, как правило, не будут возражать против ссылки.чтобы использовать его, они автоматически создадут новый экземпляр, который, так как никакой другой экземпляр больше не зарегистрирован в ROT, затем будет зарегистрирован.

Тем не менее, он все еще возможен для других приложений, чтобы получить на вашем экземпляре Word, так что этот метод не пуленепробиваемый.Как?Потому что Word ТАКЖЕ регистрирует каждый загруженный ДОКУМЕНТ в ROT.Но это довольно редко используемая функция.

5 голосов
/ 21 сентября 2010

Нет, вы не можете заблокировать экземпляр Word только для себя.

Но, основываясь на вашем комментарии, легко обойти эту проблему - не используйте ActiveDocument.Вы можете обойтись с помощью ActiveDocument, называя документ чем-то конкретным, а затем используя эту переменную (независимо от того, открываете ли вы существующий или создаете новый).

Например:

Sub NewDoc()
    Dim d As Document
    Set d = Documents.Add(Visible:=False)
End Sub
Sub ExistingDoc()
    Dim d As Document
    Set d = Documents.Open(FileName:="C:\myexisting.doc")
End Sub

В обоих случаях выше, вы просто использовали бы d вместо того, где вы использовали ActiveDocument.

...