2011-12-13 21 views
6

Sto creando un'applicazione Excel con C#. Dato che manterrò urgentemente il file excel, voglio mantenere aperto il gestore. Voglio mantenere l'id del processo excel in modo da poterlo uccidere in caso di arresto anomalo del sistema.Ottenere l'ID del processo dell'applicazione excel

Come posso ottenere il Pid Excel quando lo si crea?

+0

si può iniziare a dirci come si crea/Aprire Excel ? mostra un po 'di codice per favore –

+1

Per cosa ti serve il PID? puoi rilasciare gli oggetti Com da solo – Shai

risposta

-2

Ecco un esempio di come aprire un file Excel utilizzando Excel-Interop, e lo smaltimento correttamente l'istanza (fonte: 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(); 
    } 
+0

Perché il downvote? Solo curioso .. – abhilash

+0

Mi batte! questo esempio di codice funziona al 100% ... – Shai

+0

Probabilmente downvoted perché non risponde alla domanda! Se Excel esce a pranzo, cosa che spesso fa, rilasciare tutti i tuoi riferimenti non lo ucciderà. Hai bisogno del processo id. –

22
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); 
    } 
} 
+0

funziona molto bene grazie! – Belial09

Problemi correlati