[转]如何使用MFC和类型库创建自动化项目
本文转自:http://www.cnblogs.com/zhoug2020/archive/2012/04/01/2429064.html
摘要 本文详细介绍了如何自动化像Microsoft Office这样支持COM的应用程序。 更多信息 下面部分介绍了如何创建MFC项目。采用Microsoft Excel举例,你可以将前8个步骤用于任何项目,修改9-15步用于不同的应用程序。 创建自动化项目 . 在Microsoft Developer Studio中,创建"MFC AppWizard(exe)"项目,命名为"AutoProject."
. 在第1步的MFC应用程序向导中,选择"Dialog Based"应用程序类型并点"完成"
在创建的项目信息对话框中将显示创建的类: Application: CAutoProjectApp in AutoProject.h and AutoProject.cpp
Dialog: CAutoProjectDlg in AutoProject.h and AutoProjectDlg.cpp
点 OK 完成项目创建。
. Visual Studio设计编辑区打开了对话框"IDD_AUTOPROJECT_DIALOG" ,依照下面两步修改它。
. 删除静态控件(IDC_STATIC)和Cancel按钮(IDCANCEL)
. 将OK按钮改为"IDRUN",说明改为"Run." 关闭AutoProject.rc对话框设计界面。
. 点View菜单中的ClassWizard(或按CTRL+W)
. 选择消息映射(Message Maps)标签,在对象ID列表框中选择IDRUN,在消息列表框中选择"BN_CLICKED",点添加函数并命名为"OnRun",点OK关闭ClassWizard 提示:此步骤在AutoProjectDLG.h中定义了"OnRun();"函数,并在 AutoProjectDLG.cpp 中添加了消息处理函数CAutoProjectDlg::OnRun()。
. 点View菜单中的ClassWizard(或按CTRL+W)
. 选择Automation标签,点Add Class并选择"From a type library" 浏览并选择你希望自动化的对象库(例如,如果你自动化Excel , 则选择Microsoft Excel 8.0 对象库,默认位于 C:\Program Files\Microsoft Office\Office\Excel8.olb). 如果你自动化Microsoft Excel ,选择位于 C:\Program Files\Microsoft Office\Office\Excel9.olb 的Microsoft Excel 9.0 对象库。 如果你自动化Microsoft Excel 2002和Microsoft Office Excel ,对象库内含在Excel.exe中,Office 2002的Excel.exe 默认位于 C:\program Files\Microsoft Office\Office10\Excel.exe, Office 2003的Excel.exe 默认位于 C:\program Files\Microsoft Office\Office11\Excel.exe 。选择合适的对象库后,点Open,在类确认列表中选择所有类,点OK。 提示:类确认对话框中的列表框里包含了Microsoft Excel 类型库中的所有IDispatch接口(与类中一致)。在对话框下面可以看到命名为Excel8.cpp的执行文件,该文件包含了从COleDispatchDriver派生的封装类,头文件是Excel8.h(对于Excel 2002和Excel ,文件名为Excel.cpp和Excel.h)
. 点OK关闭MFC ClassWizard对话框
. 在 CAutoProjectApp::InitInstance() 函数中添加如下代码,用于加载COM支持库: BOOL CAutoProjectApp::InitInstance()
{
if(!AfxOleInit()) // Your addition starts here
{
AfxMessageBox("Could not initialize COM dll");
return FALSE;
} // End of your addition AfxEnableControlContainer();
.
.
. } . 在AutoProject.cpp顶部添加#include行 #include <afxdisp.h> . 在AutoProjectDlg.cpp 顶部stdafx.h下添加对excel8.h的包含 #include "stdafx.h"
#include "excel8.h" // excel.h in the case of Excel 2002 and Excel 2003. . 在CAutoProjectDlg::OnRun()中添加如下所示的自动化代码 void CAutoProjectDlg::OnRun()
{
_Application app; // app 是 Excel _Application 对象 // 启动 Excel 并得到应用程序对象
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Couldn''t start Excel.");
}
else
{
//使 Excel 可视,然后显示消息
app.SetVisible(TRUE);
AfxMessageBox ("Excel is Running!");
}
} . 编译并运行项目。运行结果:当你点击对话框中的Run按钮,Microsoft Excel将被调用。关闭消息框使Auto_Excel对话框激活。CAutoProjectDlg::OnRun()函数结束,application变量离开作用域,Microsoft Excel将退出。 附加说明 当你在项目中从类型库添加类(根据上面所说的9个步骤),你将注意到在项目中添加了许多类。在ClassView中你可以双击某个类查看该类在Excel8.cpp中的定义。 如果你需要验证返回值或改变函数的执行,你需要得到函数的定义,无论何时当你改变函数定义,记住在Excel8.h中修改定义。当你这样做的时候,请确认你改变的是正确的函数定义;有时多个类中包含了相同名字的函数,例如GetApplication。 通过以上如何自动化Microsoft Excel的讲述,你可以将这些方法应用到其它自动化程序中。下表包含了Microsoft Office应用程序类型库的名称。
应用程序(Application) 类型库(Type Library)
-------------------------------------------------------- Microsoft Access Msacc8.olb
Microsoft Jet Database 3.5 DAO350.dll
Microsoft Binder Msbdr8.olb
Microsoft Excel Excel8.olb
Microsoft Graph Graph8.olb
Microsoft Office Mso97.dll
Microsoft Outlook Msoutl97.olb
Microsoft PowerPoint Msppt8.olb Microsoft Word Msword8.olb
Microsoft Access Msacc9.olb
Microsoft Jet Database 3.51 DAO360.dll
Microsoft Binder Msbdr9.olb
Microsoft Excel Excel9.olb
Microsoft Graph Graph9.olb
Microsoft Office Mso9.dll
Microsoft Outlook Msoutl9.olb
Microsoft PowerPoint Msppt9.olb
Microsoft Word Msword9.olb Microsoft Access Msacc.olb
Microsoft Excel Excel.exe
Microsoft Graph Graph.exe
Microsoft Office MSO.dll
Microsoft Outlook MSOutl.olb
Microsoft PowerPoint MSPpt.olb
Microsoft Word MSWord.olb Microsoft Office Access Msacc.olb
Microsoft Office Excel Excel.exe
Microsoft Graph Graph.exe
Microsoft Office MSO.dll
Microsoft Office Outlook MSOutl.olb
Microsoft Office PowerPoint MSPpt.olb
Microsoft Office Word MSWord.olb 提示:除了 Dao350.dll 、Dao360.dll和 Microsoft Office (MSO.dll),类型库默认位于: C:\Program Files\Microsoft Office\Office (Office 路径是 C:\...\Office10,Office 路径是 C:\...\Office11), Dao350.dll/Dao360.dll 默认位于 C:\Program Files\Common Files\Microsoft Shared\Dao。 Office 的MSO.dll 默认 C:\Program Files\Common Files\Microsoft Shared\Office10, Office 的MSO.dll位于 C:\Program Files\Common Files\Microsoft Shared\Office11
========================================================================================== Excel . 引入类 #include "CApplication.h"
#include "CFont0.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CRange.h"
#include "CWorksheet.h"
#include "CWorksheets.h" . 主要接口 BOOL CXXX::Create(void)
{
if(!m_app.CreateDispatch(L"Excel.Application"))
{
AfxMessageBox(L"Could not start Excel.");
return FALSE;
}
m_app.put_DisplayAlerts (VARIANT_FALSE);
m_app.put_UserControl(FALSE);
return TRUE;
} void CXXX::Destroy(void)
{
//CloseWorkbook();
m_app.Quit();
m_app.ReleaseDispatch();
} int CXXX::OpenWorkbook(CString strPath)
{
try
{
LPDISPATCH lpDisp;
lpDisp = m_app.get_Workbooks(); // Get an IDispatch pointer
ASSERT(lpDisp);
m_books.AttachDispatch( lpDisp ); // Attach the IDispatch pointer to the books object. // open the document lpDisp = m_books.Open(strPath, m_covOptional, m_covOptional,
m_covOptional, m_covOptional, m_covOptional, m_covOptional,
m_covOptional, m_covOptional, m_covOptional, m_covOptional,
m_covOptional, m_covOptional, m_covOptional, m_covOptional);
ASSERT(lpDisp); //Set CWorkbook to use lpDisp, the IDispatch* of the actual workbook.
m_book.AttachDispatch(lpDisp);
m_sheets = m_book.get_Worksheets();
}
catch(COleDispatchException* e)
{
TRACE(_T("[EXCEPTION]OpenWorkbook exception COleDispatchException!!!\n"));
TCHAR msg[];
e->GetErrorMessage(msg,);
e->Delete();
MessageBox(,msg, TEXT("Error"), MB_OK | MB_ICONERROR);
return -;
}
return ;
} void Cxxxx::CloseWorkbook(void)
{
m_sheet.ReleaseDispatch();
m_sheets.ReleaseDispatch();
m_book.ReleaseDispatch();
m_books.Close();
m_books.ReleaseDispatch();
} int CXXX::ReaddExcelData(CString strPath)
{
if( - == OpenWorkbook(strPath) )
{
CloseWorkbook();
return -;
} if ( !ParseCauSheet() )
{
CloseWorkbook();
return -;
} CloseWorkbook();
return ;
} void CExcelOp::ParseSheet(void)
{
CRange range;
CRange usedRange;
COleVariant val;
CString strRangeId,strKeyword;
CString strRangePos;
int index = ; m_sheet = m_sheets.get_Item(COleVariant((short)())); // m_sheets are indexed starting from 1
usedRange = m_sheet.get_UsedRange();
range = usedRange.get_Rows();
int nRowCnt = (int)range.get_Count();
for(int i = ; i <= nRowCnt; i++)
{ 。。。。。
}
return;
}
[转]如何使用MFC和类型库创建自动化项目的更多相关文章
- 创建maven项目(cmd 命令)
2016五月 22 原 创建maven项目(cmd 命令) 分类:maven (994) (0) 1.普通方式创建 1)进入cmd窗口执行 mvn archetype:generate 2) 光标停止 ...
- EXCEL类型库的添加
1. 创建新的C++工程 创建基于对话框的MFC程序 2. 添加库.添加Excel类库 在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的M ...
- 常见MFC UI界面库[转]
Xtrme toolkit,BCGControlBar,SkinMagic,AppFace,Skin++,Uskin++,SYGUI,LibUIDK,GuiToolkit,GardenUI等等,除了后 ...
- 常见MFC UI界面库
Xtrme toolkit,BCGControlBar,SkinMagic,AppFace,Skin++,Uskin++,SYGUI,LibUIDK,GuiToolkit,GardenUI等等,除了后 ...
- Delphi COM编程技术三类型库(库文件中的工具栏,很全)
在COM组件的使用和开发过程中经常需要获取有关组件的信息.而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取.通过访问类型库就可以查看COM组件的信息. 一.类型库的基础 ...
- [UE4]使用C++重写蓝图,SpawnObject根据类型动态创建UObject
先大量使用蓝图制作项目,后续再用C++把复杂的蓝图重写一遍,用C++代码按照蓝图依葫芦画瓢就可以了,很简单,但需要遵守一些原则: 第一种方法:使用继承 一.创建一个C++类作为蓝图的父类(C++类继承 ...
- Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库 本文地址:https ...
- VS2010创建C++静态链接库创建和使用
VS2010创建C++静态链接库的方法: 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入 staLIB.点击确定. 2.在解决方案资源管理 ...
- VC 静态库与动态库(三)动态库创建与使用_隐式链接
动态库分为二种,一种隐式链接,另一种显示调用.不论哪种动态库,本质都是运行时动态加载 隐式链接:程序运行时,由编译系统自动加载动态库,然后根据程序的引入表进行重定位,当程序退出时自动卸载动态库 显示调 ...
随机推荐
- C/S转分布式数据库的解决方法
C/S转分布式数据库的解决方法1. 直接VPN建一个网不就行了.(大概是虚拟成一个网络)2. 直连也可以,就是速度慢3. 还是三层吧,推荐RTC4. 弄个花生壳硬件试试呢,成本低,不用改程序5. 搞一 ...
- I2S总线协议理解
I2S总线 Inter IC Sound总线又称集成电路内置音频总线. I2S对数字音频设备之间的音频数据传输而制定的一种总线标准. 采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分 ...
- jvm虚拟机配置 深度好文
http://blog.csdn.net/kthq/article/details/8618052
- 北斗有 35 颗卫星,而 GPS 有 24 颗卫星,为什么二者数量不同?
作者:知乎用户链接:https://www.zhihu.com/question/21092045/answer/17164418来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- kentico检查当前授权用户,是否为admin角色
https://docs.kentico.com/k11/custom-development/user-internals-and-api/checking-permissions-using-th ...
- 数组、栈、堆(java基础知识五)
1.数组概述.定义格式 * A:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. * B:数组定义格式 格式1:数据类型[ ...
- Java数据库操作类演示
只在mysql上测试过,不知道算不算好使1. [代码][Java]代码 package org.load.demo; import java.io.IOException;import ja ...
- JRE System Library 与Java EE Libraries的区别
JRE System Library是只要做java开发都需要的完整的.标准的库. Java EE5 Libraries只是java三个方向中做java EE所需要的库.如果做Web方面的开发的话就 ...
- Android隐藏Activity和图标
今天发现4.0以后如果不写Activity只写BroadcastReceiver的话,这个广播接收器是不能运行的.经过查询,好像是HoneyComb之后添加了安全机制,规定必须运行一次Activity ...
- MultiAutoCompleteTextView
Activity_mian.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...