2011-01-07 5 views
0

мое приложение создает новый экземпляр winword, встроенный в форму окна.Убить конкретный экземпляр Winword

new Microsoft.Office.Interop.Word.ApplicationClass() 

Как только пользователь заканчивает редактирование, я закрываю окно, но экземпляр winword по-прежнему работает в фоновом режиме.

Как я могу убить этот конкретный экземпляр? Я знаю, как убить все экземпляры, запущенные на машине, но это не вариант.

+1

Что делать, если, например, вы в конечном итоге с использованием также имеет документ пользователя открывается в другом окне? – Gabe

+0

Это собственное приложение с несколькими пользователями, поэтому они будут знать, что не создавать новые документы из экземпляра, который я создал для них. Но если у них есть слово, открытое отдельно за пределами моей оконной формы, я не могу закрыть его – user48408

+0

Возможный дубликат [Проблема с зависанием COM-объектов COM] (http://stackoverflow.com/questions/4503309/problem-with-hanging-interop -com-objects) –

ответ

1

Вам нужно позвонить

application.Quit() 

В вашем коде.

Одна вещь, которую я должен был сделать в своей системе (это инструмент для обработки excel), - это убить процесс, если после того, как все остальное все еще продолжается.

var openedExcel = System.Diagnostics.Process.GetProcessesByName("EXCEL"); 
      if (openedExcel.Any()) 
      { 
       foreach (var excel in openedExcel) 
       { 
        try { excel.Kill(); } 
        catch { } 
       } 
      } 
+0

где приложение является экземпляром вашего Word ApplicationClass – turtlepick

+0

Но если application.Quit() не выполнил всю работу за вас, вы прибегли к убийству всех экземпляров excel? Я не могу этого сделать – user48408

+0

Вам, вероятно, придется получить Идентификатор экземпляра вашего точного и убить его. – turtlepick

1

Существуют различные способы для этого (Marshal.ReleaseComObject является наиболее широко используемым я считаю).

Предлагаю вам ознакомиться с официальной документацией о выпуске экземпляров приложений Office. он доступен здесь: Microsoft .NET Development for Microsoft Office/Releasing COM Objects

+0

Хорошо спасибо за ссылку. Я отправлю обратно позже – user48408

0

Предлагаю вам объединить/добавить в ответ Flaviotsf в следующий код - который будет определять, что фактический процесс на бегу:

Process[] myProcList = Process.GetProcesses(); 
for (int i = 0; i <= myProcList.Length - 1; i ++) { 
    string strProcessName = myProcList [i].ProcessName; 

    string strProcessTitle = myProcList [i].MainWindowTitle(); 
     //check for your process name. 
    if (strProcessName.ToLower().Trim().Contains("access")) { 

     myProcList [i].Kill(); 
    } 
} 
Смежные вопросы