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后,资源释放以后,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)
相关文章推荐
- vc操作excel,包括合并单元格,新增,删除sheet,设置字体,底色(OLE/COM)
- MFC VC 操作Excel,word的OLE对象
- VC配置通过OLE操作EXCEL
- Perl通过WIN32 OLE来操作EXCEL
- 在VS2010中调用COM Interop DLL操作Excel通过get_Range去获取Range时,会发生Object does not contain a definition for get_Range的错误。其原因和解决方案
- VC通过Excel接口 操作Excel的方法
- EXCEL动态数据交换(OLE对象操作)
- C#与excel互操作的错误无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制
- C#与excel互操作的错误无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制
- VC/MFC使用OLE操作 EXCEL
- C#与excel互操作的错误无法将类型为“Excel.ApplicationClass”的COM 对象强制转换为接口类型“Excel._Application”
- VC++操作Excel对象
- MFC中使用OLE/COM操作EXCEL的方法
- C#操作word:将rtf中的ole对象通过MathType转换成MathML
- 通过vc 操作excel时避免重复定义的问题
- Perl通过WIN32 OLE来操作EXCEL
- 使用Win32::OLE操作Excel——Excel对象模型
- C#与excel互操作的错误无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制
- 关于VC操作Excel(解决mircoSoft jet 数据库引擎找不到对象)
- 通过ole 操作Excel