[转]如何使用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 静态库与动态库(三)动态库创建与使用_隐式链接
动态库分为二种,一种隐式链接,另一种显示调用.不论哪种动态库,本质都是运行时动态加载 隐式链接:程序运行时,由编译系统自动加载动态库,然后根据程序的引入表进行重定位,当程序退出时自动卸载动态库 显示调 ...
随机推荐
- Java异步套接字实例
服务端 package com.test.server; import java.io.IOException; import java.net.InetSocketAddress; import j ...
- 配置webpack中externals来减少打包后vendor.js的体积
在日常的项目开发中,我们会用到各种第三方库来提高效率,但随之带来的问题就是打包后的vendor.js体积过大,导致加载时空白页时间过长,给用户的体验太差.为此我们需要减少vendor.js的体积,从本 ...
- OpenSSL生成CA证书及终端用户证书
环境 OpenSSL 1.0.2k FireFox 60.0 64位 Chrome 66.0.3359.181 (正式版本)(32位) Internet Explorer 11.2248.14393. ...
- Nth prime & numbers of primes (模板)
都是取的模板,这几天做的素数题挺多的,所以整理了放在这里,感觉有一天回用到的! SPOJ:Nth Prime: 求第N个素数,N<1e9. #include<bits/stdc++ ...
- AFNetworking 2.0教程
在iOS 7中,Apple更新了iOS中的网络基础架构,新推出的网络基础架构是NSURLSession(原来的网络基础架构NSURLConnection). iOS开发中往往会涉及网络数据处理,像其他 ...
- BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP
BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP Description 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏. 初始时,一个有N(5 ...
- [SDOI2016] 模式字符串 (BZOJ4598 & VIJOS1995)
首先直接点分+hash就可以做,每个点用hash判断是否为S重复若干次后的前缀或后缀,每个子树与之前的结果O(m)暴力合并.在子树大小<m时停止分治,则总复杂度为O(nlog(n/m)). 问题 ...
- 「LuoguP4779」 【模板】单源最短路径(标准版)
Description 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100→60: Ag→Cu: 最终,他 ...
- 「 LuoguT37042」 求子序列个数
Description 给定序列 A, 求出 A 中本质不同的子序列 (包含空的子序列) 个数模 10^9+ 7 的结果. 一个序列 B 是 A 的子序列需要满足 A 删掉某些元素后能够得到 B. 两 ...
- [NOIP 2018 Day1] 简要题解
[题目链接] 铺设道路 : https://www.luogu.org/problemnew/show/P5019 货币系统 : https://www.luogu.org/problemnew/sh ...