[转]如何使用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 静态库与动态库(三)动态库创建与使用_隐式链接
动态库分为二种,一种隐式链接,另一种显示调用.不论哪种动态库,本质都是运行时动态加载 隐式链接:程序运行时,由编译系统自动加载动态库,然后根据程序的引入表进行重定位,当程序退出时自动卸载动态库 显示调 ...
随机推荐
- js对table操作(添加删除交换上下TR)
<table width="100%" border="0" cellpadding="2" cellspacing="1& ...
- VMWare Workstation 配置docker多macvlan网络方法
VMWare Workstation 配置docker多macvlan网络方法 答案就是.....换VirtualBox 噗... VMWare Workstation host-only网络,三台虚 ...
- Redis实现中间件(订阅)
什么是消息中间件 发布订阅 点对点 消息中间件本身是异步的通讯 案例:使用redis实现发布订阅功能 Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub) ...
- 以太坊EVM1.0缺陷
256位的虚拟机 目前主流的CPU是32位或64位,在这些机器上进行256位运算需要将256位分段成多个64位指令执行,执行效率比32/64位低,在存储上方面,保存一个数需要256位的存储空间,绝大多 ...
- ios蓝牙开发(四)BabyBluetooth蓝牙库介绍
BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮你 ...
- intellij IDEA怎样打war包
intellij IDEA怎样打war包 1: File-->Project Structure-->Artifacts, 点击+,选择Web Application:archive 可自 ...
- Silverlight结合Web Service进行文件上传
search了非常多的文章,总算勉强实现了.有许多不完善的地方. 在HCLoad.Web项目下新建目录Pics复制一张图片到根目录下. 图片名:Bubble.jpg 右击->属性->生成操 ...
- 【转载】Android Studio简单设置
界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings --> Appearance --> Theme ,选择 Darcula 主题即可 ...
- codeforces 691B B. s-palindrome(水题)
题目链接: B. s-palindrome 题意: 问给定的字符串是否是镜面对称; 思路: 直接看哪些字母是镜面对称的就行: AC代码: //#include <bits/stdc++.h> ...
- 状态空间搜索好题UVA10603
题目 分析:注意这里求的是最少流量, 二不是最少步数!!!所以我们用优先队列去维护一个最小流量,然后进行bfs即可,解释一下一个重要的数组ans[i],表示的是杯子中的水为i时的最小流量 #inclu ...