2013-09-04 5 views
0

Я пытаюсь убить экземпляр до сих пор работает Outlook (используется в моем приложении не сама перспектива), я называю следующее в моем Разрушительне может убить еще запущенный экземпляр Outlook,

 //_app = Microsoft.Office.Interop.Outlook.Application 
     _app.Quit(); 
     Marshal.FinalReleaseComObject(_app); 
     Marshal.FinalReleaseComObject(_app.Session); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 

Но ничего не помогает , есть ли еще больше способов убить его, и если да, то как?

ответ

4

Сначала импорт user32.dll делается, чтобы иметь возможность использовать GetWindowThreadProcessId

Тогда метод убийства получает прогноз приложения параметра и получает процесс и убивает его

public static class OutlookKiller 
{ 
     [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true, 
CharSet = CharSet.Unicode, ExactSpelling = true, 
CallingConvention = CallingConvention.StdCall)] 
    private static extern long GetWindowThreadProcessId(long hWnd, out long lpdwProcessId); 

    public static void Kill(ref Microsoft.Office.Interop.Outlook.Application app) 
    { 
     long processId = 0; 
     long appHwnd = (long)app.Hwnd; 

     GetWindowThreadProcessId(appHwnd, out processId); 

     Process prc = Process.GetProcessById((int)processId); 
     prc.Kill(); 
    } 
} 
+0

Не могли бы вы объяснить код? Если вы получили его откуда-то, где? Важно знать это, так что другие, сталкивающиеся с ним, действительно знают, а) откуда оно взялось, и б) что это за общая идея. – Arran

+1

@Arran Я обновил ответ, чтобы объяснить код –

+0

@Mauricio Gracia Спасибо за ваши усилия, но (long) app.Hwnd кажется не правильным –

Смежные вопросы