VS2010 简单ATL COM开发(下)
2015-10-18 21:40
309 查看
前面一章介绍了怎么创建ATL COM组件及注册,下面简单介绍如何调用COM组件。
1、在MFC中调用有一种很方便的方法,就是通过ClassWizard利用类型库生成包装类,不过有个前提就是com组件的接口必须是派生自IDispatch。
具体方法:
(1)VS2010新建一个MFC基于对话框程序,调出类向导,点击“添加类”下拉菜单,选择“类型库中的MFC类”(From a type libarary)。
(2)选“注册表”,然后在“可用类型库”中定位到FirstCOMLib<1.0>,接下来会出来该库中的所有接口,选择你想生成的接口包装类IFirstClass后点击“完成”,向导会自动生成相应的.h文件,这样你就可以在你的MFC工程中像使用普通类那样使用COM组件了.
(3)代码编写:
首先引入头文件 #include "CFirstClass.h"
为对话框程序添加一个“测试”按钮,添加按钮单击响应函数
[cpp]
view plaincopyprint?
[cpp]
view plaincopyprint?
void CFirstCOMTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CoInitialize(NULL);
CFirstClass m_mymath;
if (!m_mymath.CreateDispatch(_T("FirstCOM.math.1")))//创建COM对象:这里的字符串一定要和注册表中的ProgID一致!!!
{
MessageBox(_T("创建COM组件失败:请检查ProgID是否正确,组件是否已经注册"));
return;
}
else
{
long ret = m_mymath.Add(1,2);//调用COM接口
CString strTemp;
strTemp.Format(_T("%d"),ret);
MessageBox(strTemp);
}
CoUninitialize();
}
关于m_mymath.CreateDispatch(_T("FirstCOM.math.1")) 中字符串"FirstCOM.math.1",其实跟我们上一章中定义类时ProgID有关,如果忘记,可以在FirstClass.rgs文件里找,rgs是组件注册的脚本文件,当你用 Regsvr32.exe注册组件时,组件内部便是调用了这个文件。rgs文件是以资源的形式存于DLL内的。
[cpp]
view plaincopyprint?
HKCR
{
FirstCOM.math.1 = s 'FirstClass Class'
{
CLSID = s '{C56D80DE-DA4C-4731-81A6-48B8D0BDB2FD}'
}
FirstCOM.math = s 'FirstClass Class'
{
CurVer = s 'FirstCOM.math.1'
}
其中 CurVer=s'FirstCOM.math.1' 中的 FirstCOM.math.1 就是我们需要的那个字符串。
(4)编译运行,点击测试按钮,结果如下:
2、在SDK中调用最简单最常用的一种,用#import导入类型库,利用VC提供的智能指针包装类
VS2010创建Win32控制台应用程序,编写如下代码:
[cpp]
view plaincopyprint?
#include "stdafx.h"
#include "atlcomcli.h"
#import "FirstCOM.dll" no_namespace
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
CLSID clsid;
CLSIDFromProgID(OLESTR("FirstCOM.math.1"),&clsid);
CComPtr<IFirstClass> pFirstClass;//智能指针
pFirstClass.CoCreateInstance(clsid);
long ret = pFirstClass->Add(1,2);
printf("%d\n",ret);
pFirstClass.Release();
CoUninitialize();
return 0;
}
其中头文件atlcomcli.h中定义了智能指针CComPtr。
运行结果:
还有一些调用COM组件的方法,参见VC调用COM组件。
1、在MFC中调用有一种很方便的方法,就是通过ClassWizard利用类型库生成包装类,不过有个前提就是com组件的接口必须是派生自IDispatch。
具体方法:
(1)VS2010新建一个MFC基于对话框程序,调出类向导,点击“添加类”下拉菜单,选择“类型库中的MFC类”(From a type libarary)。
(2)选“注册表”,然后在“可用类型库”中定位到FirstCOMLib<1.0>,接下来会出来该库中的所有接口,选择你想生成的接口包装类IFirstClass后点击“完成”,向导会自动生成相应的.h文件,这样你就可以在你的MFC工程中像使用普通类那样使用COM组件了.
(3)代码编写:
首先引入头文件 #include "CFirstClass.h"
为对话框程序添加一个“测试”按钮,添加按钮单击响应函数
[cpp]
view plaincopyprint?
[cpp]
view plaincopyprint?
void CFirstCOMTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CoInitialize(NULL);
CFirstClass m_mymath;
if (!m_mymath.CreateDispatch(_T("FirstCOM.math.1")))//创建COM对象:这里的字符串一定要和注册表中的ProgID一致!!!
{
MessageBox(_T("创建COM组件失败:请检查ProgID是否正确,组件是否已经注册"));
return;
}
else
{
long ret = m_mymath.Add(1,2);//调用COM接口
CString strTemp;
strTemp.Format(_T("%d"),ret);
MessageBox(strTemp);
}
CoUninitialize();
}
关于m_mymath.CreateDispatch(_T("FirstCOM.math.1")) 中字符串"FirstCOM.math.1",其实跟我们上一章中定义类时ProgID有关,如果忘记,可以在FirstClass.rgs文件里找,rgs是组件注册的脚本文件,当你用 Regsvr32.exe注册组件时,组件内部便是调用了这个文件。rgs文件是以资源的形式存于DLL内的。
[cpp]
view plaincopyprint?
HKCR
{
FirstCOM.math.1 = s 'FirstClass Class'
{
CLSID = s '{C56D80DE-DA4C-4731-81A6-48B8D0BDB2FD}'
}
FirstCOM.math = s 'FirstClass Class'
{
CurVer = s 'FirstCOM.math.1'
}
其中 CurVer=s'FirstCOM.math.1' 中的 FirstCOM.math.1 就是我们需要的那个字符串。
(4)编译运行,点击测试按钮,结果如下:
2、在SDK中调用最简单最常用的一种,用#import导入类型库,利用VC提供的智能指针包装类
VS2010创建Win32控制台应用程序,编写如下代码:
[cpp]
view plaincopyprint?
#include "stdafx.h"
#include "atlcomcli.h"
#import "FirstCOM.dll" no_namespace
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
CLSID clsid;
CLSIDFromProgID(OLESTR("FirstCOM.math.1"),&clsid);
CComPtr<IFirstClass> pFirstClass;//智能指针
pFirstClass.CoCreateInstance(clsid);
long ret = pFirstClass->Add(1,2);
printf("%d\n",ret);
pFirstClass.Release();
CoUninitialize();
return 0;
}
其中头文件atlcomcli.h中定义了智能指针CComPtr。
运行结果:
还有一些调用COM组件的方法,参见VC调用COM组件。
相关文章推荐
- 搭建Android UI Testing自动化测试开发环境
- 原型模式之深浅复制
- VS2010 简单ATL COM开发(上)
- 【LeetCode】Ugly Number II 解题报告
- Spring boot mongo pom
- android 45 通知
- js实现分页的几个源码,看完基本就懂了
- iOS GDataXMLNode 解析XML DOM方式 总结
- HashMap实现原理
- linux下对mysql的数据库进行定时备份
- 必须熟练英语
- 第三次作业 计算器
- IOS圆形头像的设置
- c语言中的变量声明
- 归并排序
- 周日
- sharepoint 2016 学习系列篇(13)-自定义列表应用篇-(2)添加字段栏
- Ruby学习-Ruby类的使用
- ARM应用程序调试
- java实现压缩、解压缩的常见问题Memo