创建专有的单词实例

时间:2010-09-21 14:28:35

标签: visual-studio-2010 ms-word c#-4.0 ms-office

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

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

提前致谢。

顺便说一下:找到一些带有exclusive / word / office / isolated / block / instance的东西,但无论如何都没有答案。

2 个答案:

答案 0 :(得分:7)

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

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

  1. 尝试GetObject(即查询正在运行的实例的ROT)
  2. 如果你得到一个,你知道你必须在VB中创建一个新的Word实例(CreateObject,其他langs的过程不同。)
  3. 如果你没有得到一个,你必须创建2个新的Word实例。第一个会在ROT中自动注册,第二个不会。使用第二个实例,第一个实例。
  4. 即使你终止了第一个实例,它也不会“追溯”地在ROT中注册自己,而其他应用程序通常不会对它的引用进行对象使用,它们会自动创建一个新的实例,没有其他实例在ROT中注册,然后将被注册。

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

答案 1 :(得分: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

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