我正在开发一个Windows应用程序,可以在其中操纵Word应用程序。更具体地说,我正在打开Word文档,但是当我退出它并尝试打开另一个Word文档时,就会出现此错误。
如何处理
System.Runtime.InteropServices.COMException(0x800706BA):RPC服务器不可用。 (来自HRESULT的异常:0x800706BA)位于Microsoft.Office,Word.ApplicationClass.set_Visible(Boolean Prop)**
如果我不退出Word应用程序,则不会出现此错误。
下面,我向您展示我打开并退出Word应用程序的功能。
//function to open word Document located in a specific path
public static void openWordDocument(string fileName)
{
try
{
wordApplication.Visible = true;
string filePath = myPath + fileName;
WordApi.Document docx = wordApplication.Documents.Open(filePath);
}
catch (Exception ex)
{
MyLogger.Error(ex.ToString());
}
}
//function to quit wordApplication
public static void CloseWordApp() {
try {
Object wordAppObject = Marshal.GetActiveObject("Word.Application");
WordApi.Application wordApp = (WordApi.Application)wordAppObject; //cast Object to its actual type
wordApp.Quit();
}
catch (Exception ex) {
MyLogger.Error(ex.ToString());
}
答案 0 :(得分:2)
我终于弄清楚是什么问题。
主要问题是当我退出并尝试打开另一个Word文档时,打开另一个Word文档意味着获取/创建Word应用程序的对象。在我的案例wordApp != null
中,在完成应用程序的确定后,我不得不创建另一个 Word应用程序对象,并根据情况返回它。
//open word Document located in a specific path
public static void openWordDocument(string fileName)
{
try
{
wordApplication = createWordApplicationObject(wordApplication);
wordApplication.Visible = true;
string filePath = myPath + fileName;
WordApi.Document docx = wordApplication.Documents.Open(filePath);
}
catch (Exception ex)
{
MyLogger.Error(ex.ToString());
}
}
private static WordApi.Application createWordApplicationObject(WordApi.Application wordApp)
{
WordApi.Application wordAppFirstTime;
WordApi.Application wordApp1;
if (wordApp == null)
{
wordAppFirstTime = new WordApi.Application();
return wordAppFirstTime;
}
else
{
wordApp1 = new WordApi.Application();
return wordApp1;
}
}
与 CloseWordApp()保持不变。
答案 1 :(得分:1)
以下一行代码很可能触发了异常:
value = []
for p in total_pageview:
for c in total_conversion:
if p['y'] == c['y'] and p['m'] == c['m'] and p['d'] == c['d']:
value.append({'year':p['y'], 'month':p['m'], 'day':p['d'], 'total':(float(c['c'])/float(p['p']))*100})
您需要确保COM服务器处于活动状态。因为退出后该对象变得不可用。我建议将此类对象引用设置为null,以便稍后我们可以检查应用程序对象是否仍然存在。例如:
wordApplication.Visible = true;