首页 > 代码库 > VC通过OLE/COM对象操作EXCEL

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)

 


本文出自 “爱我所爱” 博客,请务必保留此出处http://tommy.blog.51cto.com/113624/1939631

VC通过OLE/COM对象操作EXCEL