TWordApplication and Word collision



我在Delphi中使用TWordApplication。我的应用程序打开一个新的word实例,在它的文档上做一些东西。问题是当我第一次运行我的应用程序和下一个打开真正的word exe。Word exe没有打开新的Word实例,但它链接到我的应用程序实例。因此,当我的应用程序写入其文档时,所有文本都显示在用户可见的exe word上。

WordApp := TWordApplication.Create(nil);
WordApp.ConnectKind := ckNewInstance;
(WordApp.Documents.Add(EmptyParam,EmptyParam,EmptyParam, varFalse ));

然后用户手动打开Word。

WordApp.Selection.Text := 'test test test';

用户在手动打开的Word中看到'test test test'。

如果我首先手动打开Word并启动我的应用程序,则一切正常

这是Word的默认行为,它使用正在运行的实例。您需要做的是存储对要修改的文档的引用。所以不要使用ActiveDocument,而是使用你存储的Document。因为不能保证ActiveDocument就是你认为的那个文档。

//starting Word
var
  App: TWordApplication;
  Doc: WordDocument;
begin
  App := TWordApplication.Create(nil);
  Doc := App.Documents.AddOld(EmptyVar, EmptyVar); //open new document
<..somewhere else..>
  //modifying Word
  Doc.DoWhateverIWant;  // <--see? no ActiveDocument, so you are not 
                      //             modifying the users doc

务必使用

WordApp.ConnectKind := ckNewInstance;

打开word应用程序。要么在代码中执行(如上所述),要么在设计时设置该属性。这确保您总是在运行Word的新实例,并且它保持隐藏,除非您显式地使其可见。任何打开Word的用户总是会得到一个不同的Word实例,并且不会看到你在文档中添加了什么(除非你已经保存了它,并且他们打开了保存的文档)。

From the doc:

设置ConnectKind以指示如何ConnectKind组件建立一个连接。ConnectKind建立应用程序时的连接运行(如果AutoConnect是True True)或当应用程序调用Connect时方法。

下表列出了可能的值:

//Value                Meaning  
//ckRunningOrNew       Attach to a running server or create a new instance of the server.   
//ckNewInstance        Always create a new instance of the server.   
//ckRunningInstance    Only attach to a running instance of the server.   
//ckRemote             Bind to a remote instance of the server. When using this option,
//                     you must supply a value for RemoteMachineName.   
//ckAttachToInterface  Don't bind to the server. Instead, the application supplies an
//                     interface using the ConnectTo method, which is introduced in
//                     descendant classes. This option can't be used with the AutoConnect
//                     property.   

实际上,打开Word可能打开了一个不同的实例(这是我对D5/Word97的记忆),但目前Word确实重用了应用程序打开的实例。因此,为了避免"在用户手动打开的word文档上刮花",您确实需要避免使用ActiveDocument

根据http://support.microsoft.com/kb/210565,有几个命令行开关将导致Word启动一个新实例。我在Word2003中使用的是/x

最新更新