VS2010 简单ATL COM开发(下)

8 篇文章 0 订阅

前面一章介绍了怎么创建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"

为对话框程序添加一个“测试”按钮,添加按钮单击响应函数

  1.   
</pre><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank title="view plain" class="ViewSource" href="http://blog.csdn.net/wangwenjing90/article/details/8772376#">view plain</a><a target=_blank title="copy" class="CopyToClipboard" href="http://blog.csdn.net/wangwenjing90/article/details/8772376#">copy</a><a target=_blank title="print" class="PrintSource" href="http://blog.csdn.net/wangwenjing90/article/details/8772376#">print</a><a target=_blank title="?" class="About" href="http://blog.csdn.net/wangwenjing90/article/details/8772376#">?</a></div></div><ol class="dp-cpp"><li class="alt"><span><span class="keyword">void</span><span> CFirstCOMTestDlg::OnBnClickedButton1()  </span></span></li><li><span>{  </span></li><li class="alt"><span>    <span class="comment">// TODO: 在此添加控件通知处理程序代码</span><span>  </span></span></li><li><span>    CoInitialize(NULL);  </span></li><li class="alt"><span>    CFirstClass m_mymath;  </span></li><li><span>    <span class="keyword">if</span><span> (!m_mymath.CreateDispatch(_T(</span><span class="string">"FirstCOM.math.1"</span><span>)))</span><span class="comment">//创建COM对象:这里的字符串一定要和注册表中的ProgID一致!!! </span><span>  </span></span></li><li class="alt"><span>    {  </span></li><li><span>        MessageBox(_T(<span class="string">"创建COM组件失败:请检查ProgID是否正确,组件是否已经注册"</span><span>));  </span></span></li><li class="alt"><span>        <span class="keyword">return</span><span>;  </span></span></li><li><span>    }  </span></li><li class="alt"><span>    <span class="keyword">else</span><span>  </span></span></li><li><span>    {  </span></li><li class="alt"><span>        <span class="datatypes">long</span><span> ret = m_mymath.Add(1,2);</span><span class="comment">//调用COM接口 </span><span>  </span></span></li><li><span>        CString strTemp;  </span></li><li class="alt"><span>        strTemp.Format(_T(<span class="string">"%d"</span><span>),ret);  </span></span></li><li><span>        MessageBox(strTemp);  </span></li><li class="alt"><span>    }  </span></li><li><span>    CoUninitialize();  </span></li><li class="alt"><span>}  </span></li></ol></div><pre class="cpp" style="display: none;" name="code">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内的。
  1. HKCR  
  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.     }  
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控制台应用程序,编写如下代码:

  1. #include "stdafx.h"  
  2.   
  3. #include "atlcomcli.h"  
  4. #import "FirstCOM.dll" no_namespace  
  5.   
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     CoInitialize(NULL);  
  9.     CLSID clsid;  
  10.     CLSIDFromProgID(OLESTR("FirstCOM.math.1"),&clsid);  
  11.     CComPtr<IFirstClass> pFirstClass;//智能指针  
  12.     pFirstClass.CoCreateInstance(clsid);  
  13.     long ret = pFirstClass->Add(1,2);  
  14.     printf("%d\n",ret);  
  15.     pFirstClass.Release();  
  16.     CoUninitialize();  
  17.   
  18.     return 0;  
  19. }  
#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组件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值