VC通過OLE/COM對象操作EXCEL

vc通過excel的COM接口來操作EXCEL時,功能比較強大,可以對EXCEL進行表格的幾乎所有操作,在操作時如果利用SAFEARRAY數組,性能也會大幅度提升。

但是有一個問題,在操作完EXCEL後,資源釋放以後,EXCEL進程怎麼也關不掉!!!我嘗試了很多種辦法,都無效,最後無意間發現導致EXCEL進程不能關閉的原因是,EXCEL中加載了第三方的COM組件(我的是金山殺毒的EXCEL加載項引起的),查找EXCEL加載項的方法是(excel2010版本):

點擊【文件】---【選項】---【加載項】,在右側窗口就可以“查看和管理Microsoft Office加載項"。


但知道這個原因,在程序使用之前,先手動這樣操作效果也非常不好!我寫好的程序也不能一臺電腦一臺電腦的檢查及這樣處理,並且不可預知各個電腦到底是由哪個加載項引起!這個方法因此斷不可行!

後面在查找EXCEL指針_Application中查應的函數時,發現有一個函數可以處理,具體操作原理是:

查找當前EXCEL應用程序窗口的句柄(hwnd),然後根據hwnd找到此程序的進程ID,最後根據進程ID結束進程。比如定義excel應用程序的指針是(_Application xlsApp),具體操作方法如下:

    long id=0;     //句柄標識

    long pid=0;    //進程pid

     HANDLE hProcess=NULL;    //進程的句柄

    1、long id=m_xlsApp.GetHwnd();    //根據GetHwnd()方法獲取此應用程序的句柄id

    2、GetWindowThreadProcessId((HWND)id,&pid);然後由應用程序的句柄id,獲取進程的pid
    3、HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); //獲取當前進程在系統中的句柄

 TerminateProcess(hProcess,1);    //根據hProcess結束當前應用程序的進程

    第3步的結束程序也可以用以下函數代替:

     1)  SendMessage(m_xlsApp.GetHwnd(),WM_CLOSE,0,0);

    2) str.Format(_T("cmd /c   tskill %d"),pid); winExec(str,SW_HIDE)

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章