我正在使用Microsoft Word主互操作程序集来从属MS Word。我的应用程序打开了自己的Word窗口(使用Microsoft.Office.Interop.Word.Application的实例)。应用程序完成后,我想关闭我打开的Word窗口,但我不想影响用户可能打开的其他Word窗口。如果我使用Application.Quit,那么所有Word窗口最终都会关闭。如果我使用Application.ActiveWindow.Close然后单词 document 关闭,但我创建的Word窗口仍然保持打开状态,这是一个空白屏幕,这是不可取的。
如何告诉Word通过其API关闭我打开的Word实例而不影响其他实例?这类似于单击Word窗口右上角的X时的行为。
答案 0 :(得分:3)
我意识到这是一个迟到的修复,但这对我有用;
创建单词应用程序对象时,创建一个临时Word对象,先打开它,然后打开正确的单词文档......然后关闭临时单词对象。
这可能看起来浪费了空间和内存,但这样做可以确保您创建的winword.exe保留在它自己的位置,并且新创建的word文档不会与您的文件挂钩。
Private sub OpenWord()
Dim MyWord as Object
Dim MyTempWord as Object
//I use the CreateObject in my application, but this will be however
//you declare your word application
MyTempWord = CreateObject("Word.Application")
MyWord = CreateObject("Word.Application")
MyTempWord.Quit(SaveChanges:=0)
//*Carry on doing whatever your app does*
//*After Finishing App stuff Close it...*
If MyWord IsNot Nothing Then
MyWord.Quit(SaveChanges:=0)
Marshal.FinalReleaseComObject(MyWord)
End If
End Sub
要重现此问题,我必须在我的应用程序中打开单词,然后通过快捷方式(Microsoft office word)打开一个单独的单词。当我的应用程序调用MyWord.Quit()时,它会关闭两个文档实例。问题是新创建的文档挂钩到应用程序创建的WINWORD.EXE,因此当您关闭应用程序时,它会关闭另一个文档(即使它们出现在不同的实例中)。
我花了很长时间修复,我希望它可以帮助别人!
答案 1 :(得分:0)
使用Word.Application.Quit()
和Marshall.FinalReleaseComObject(Word.Application)
我已经能够同时打开多个Word实例,并且只关闭我要关闭的特定实例。
这是一些快速示例代码(来自C#控制台应用程序):
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Word;
namespace WordTest
{
internal class Program
{
private static void Main(string[] args)
{
var p = new Program();
p.Test();
}
public void Test()
{
var msWord = new Application();
CloseWord(msWord);
}
public void CloseWord(Application word)
{
if (word != null)
{
word.Quit();
Marshal.FinalReleaseComObject(word);
}
}
}
}