我在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