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)