ATL的建立与调用

来源:互联网 发布:大型商场数据分析 编辑:程序博客网 时间:2024/06/10 02:45

1、打开VS2010,新建ATL COM 项目,步骤:“文件” --》“新建” --》“项目”,选择“Visual C++” --》“ATL 项目” ,填写“名称” FirstCOM --》“确定”。

2、ATL 项目向导,勾选 【支持COM+ 1.0】和【支持部件注册器】,其他默认,点击完成。

3、切换到类视图,右键单击项目“FirstCOM”--》“添加”  --》“类”。

 

4、选“ATL”  --》“ATL 简单对象” --》“添加”。

5、ATL  简单对象向导,“简称”中输入类名称FirstClass,其他输入框会自动填写,最下面的“ProgID”没有自动填写,最好自己写上一个,如FirstCOM.math,否则后面无法正确调用组件,点击“完成”。如果出现提示【是否覆盖现有文件】,点击【是】即可。

6、切换到类视图,选中刚才添加的接口IFirstClass,如下,然后右键单击【添加】添加方法。

7、添加方法向导,在"方法名"  下输入Add。增加两个输入参数:勾选【in】,选择参数类型LONG,输入参数名para1,点击“添加”。同样操作增加参数para2。然后增加一个返回参数:先选择参数类型LONG*,再勾选【retval】,输入参数名result,点击添加。点击“完成”即可,如果点击下一步,不需要填写信息,点击“完成”即可。

8、切换到解决方案资源管理器,展开项目“源文件”, 双击 FirstCom.idl 打开IDL定义文件,看到如下代码,就是定义的COM方法了。

9、双击打开FirstClass.cpp  编辑代码:*result = para1 + para2

[cpp] view plaincopy
  1. #include "stdafx.h"  #include "FirstClass.h"    
  2. // CFirstClass    
  3. STDMETHODIMP CFirstClass::Add(LONG para1, LONG para2, LONG* result)    
  4. {    
  5.     // TODO: 在此添加实现代码    
  6.      *result = para1 + para2;    
  7.    return S_OK;    
  8. }    

10、编译运行,会生成dll文件,并自动注册到系统中。


下面简单介绍如何调用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 plaincopy
  1. void CFirstCOMTestDlg::OnBnClickedButton1()    
  2. {    
  3.     // TODO: 在此添加控件通知处理程序代码    
  4.     CoInitialize(NULL);    
  5.     CFirstClass m_mymath;    
  6.     if (!m_mymath.CreateDispatch(_T("FirstCOM.math.1")))//创建COM对象:这里的字符串一定要和注册表中的ProgID一致!!!     
  7.     {    
  8.         MessageBox(_T("创建COM组件失败:请检查ProgID是否正确,组件是否已经注册"));    
  9.         return;    
  10.     }    
  11.     else    
  12.     {    
  13.         long ret = m_mymath.Add(1,2);//调用COM接口     
  14.         CString strTemp;    
  15.         strTemp.Format(_T("%d"),ret);    
  16.         MessageBox(strTemp);    
  17.     }    
  18.     CoUninitialize();    
  19. }    


 

关于m_mymath.CreateDispatch(_T("FirstCOM.math.1")) 中字符串"FirstCOM.math.1",其实跟我们上一章中定义类时ProgID有关,如果忘记,可以在FirstClass.rgs文件里找,rgs是组件注册的脚本文件,当你用 Regsvr32.exe注册组件时,组件内部便是调用了这个文件。rgs文件是以资源的形式存于DLL内的。

 

[cpp] view plaincopy
  1. KCR    
  2. {    
  3.     FirstCOM.math.1 = s 'FirstClass Class'    
  4.     {    
  5.         CLSID = s '{C56D80DE-DA4C-4731-81A6-48B8D0BDB2FD}'    
  6.     }    
  7.     FirstCOM.math = s 'FirstClass Class'    
  8.     {           
  9.         CurVer = s 'FirstCOM.math.1'    
  10.     }    

其中 CurVer=s'FirstCOM.math.1' 中的 FirstCOM.math.1 就是我们需要的那个字符串。

4)编译运行,点击测试按钮,结果如下:


0 0
原创粉丝点击