创建专有的单词实例

Gpx*_*Gpx 5 ms-word ms-office visual-studio-2010 c#-4.0

我正在用ac#.net4 winforms应用程序中的interop创建一个单词(14)实例来处理文档.如果某个word文档在我的应用程序之外被打开,则会使用相同的单词实例来扰乱我的应用程序.

简单的问题:有没有办法设置我的单词实例专用于我的应用程序?

提前致谢.

顺便说一句:发现一些东西与独家/ word/office/isolated/block/instance但无论如何都没有答案.

Dar*_*inH 7

有一种解决方案,但它并不漂亮.主要问题是Word在ROT(运行对象表)中注册自己,然后其他应用程序可以轻松访问在ROT中注册的Word实例(例如VB GetObject函数所执行的操作).

所以,在你的应用程序中,你基本上必须做两件事

  1. 尝试GetObject(即查询正在运行的实例的ROT)
  2. 如果你得到一个,你知道你必须创建一个新的Word实例(VB中的CreateObject,其他langs的过程是不同的).
  3. 如果你没有得到一个,你必须创建2个新的Word实例.第一个会在ROT中自动注册,第二个不会.使用第二个实例,第一个实例.

即使你终止了第一个实例,它也不会"追溯"地在ROT中注册自己,而其他应用程序通常不会对它的引用进行对象使用,它们会自动创建一个新实例,因为没有其他实例已经在ROT注册,然后将被注册.

也就是说,其他应用程序仍然可以使用您的Word实例,因此这种技术不是防弹的.怎么样?因为Word ALSO在ROT中注册每个加载的DOCUMENT.但这是一个很少使用的功能.


Tod*_*ain 5

不,你无法为自己锁定一个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
Run Code Online (Sandbox Code Playgroud)

在上述两种情况下,您只需使用d代替您以前使用的位置ActiveDocument.