您的位置:首页 > 其它

VC通过OLE/COM对象操作EXCEL

2017-06-19 09:49 721 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel 结束 GetHwnd