14

I am creating an excel application with c#. Since I will maintain the excel file in urgency I want to keep its handler open. I want to keep the excel process id so I will be able to kill it in case the system crashs.

How can I get the Excel Pid when creating it?

2
  • can you start telling us how you create/open excel? show some code please Commented Dec 13, 2011 at 14:10
  • 1
    What do you need the PID for? you can release the Com objects yourself Commented Dec 13, 2011 at 14:10

2 Answers 2

48
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using System.Diagnostics;

class Sample
{
    [DllImport("user32.dll")]
    static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);

    Process GetExcelProcess(Excel.Application excelApp)
    {
        int id;
        GetWindowThreadProcessId(excelApp.Hwnd, out id);
        return Process.GetProcessById(id);
    }
}
Sign up to request clarification or add additional context in comments.

Comments

-1

Here's an example of how to open an Excel file using Excel-Interop, and properly disposing the instance (source: google)

    Application ExcelObj = new Application();
    Workbook WB = ExcelObj.Workbooks.Open(fileName,
        0, true, 5, "", "", true, XlPlatform.xlWindows, "\t",
        false, false, 0, true, false, false);
    Sheets sheets = WB.Worksheets;
    Worksheet WS = (Worksheet)sheets.get_Item(1);
    Range excelRange = WS.UsedRange;

        ... (DO STUFF?)

        // Get rid of everything - close Excel
        while (Marshal.ReleaseComObject(WB) > 0) { }
        WB = null;
        while (Marshal.ReleaseComObject(sheets) > 0) { }
        sheets = null;
        while (Marshal.ReleaseComObject(WS) > 0) { }
        WS = null;
        while (Marshal.ReleaseComObject(excelRange) > 0) { }
        excelRange = null;
        GC();
        ExcelObj.Quit();
        while (Marshal.ReleaseComObject(ExcelObj) > 0) { }
        ExcelObj = null;
        GC();

    public static void GC()
    {
        System.GC.Collect();
        System.GC.WaitForPendingFinalizers();
        System.GC.Collect();
        System.GC.WaitForPendingFinalizers();
    }

4 Comments

Probably downvoted because it doesn't answer the question! If Excel goes out to lunch, which it often does, releasing all your references to it is not going to kill it. You NEED the process id.
Yes, you do. Excel processes started through COM are not child processes of your process, they are children of svchost.exe. If Excel is performing a blocking operation such as QueryTable.Refresh(), and your process exits, excel.exe will not die. If you're doing those refreshes in threads or subprocesses, which you might need to terminate, you're doomed to accumulate zombie excel processes, UNLESS you can track their process id's and kill them.
@NoahYetter I've been working with Excel through COM for the past 3 years and have never had problems with zombie processes using this code.
Have you ever used QueryTable.Refresh()? Seriously, try it. Create a thread or subprocess, launch excel, load a workbook, start a long-running Refresh(), then terminate your thread/process. Instant zombie excel.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.