12.1.8 使用智能指针的封装类创建COM对象

2013-10-07 00:16:26 · 作者: · 浏览: 85

12.1.8  使用智能指针的封装类创建COM对象

1.问题阐述

在前面就已经说过,COM之间的通讯是跨语言的,在前面都只直接包含了C接口,那么如果一个COM对象没有给C接口,应该如何调用呢?

2.实现技巧

在前面提到过,为了实现跨语言,微软提供了一个新的文件格式.idl,idl经过编译后,生成二进制的等价类型库文件 TLB提供给其他的语言使用。首先要将这个文件导入到工程中:

#import "..\Object\OBJECT.tlb" no_namespace

编译后会生成.tlh和.tlh文件的智能指针包装,利用智能指针包装创建对象。

3.实例代码

本实例演示了如何使用智能包装类创建COM对象,代码如下:

void CExample3Dlg::OnExeBtn() 
{
UpdateData(TRUE);
IFunPtr  spFun;
HRESULT hr = spFun.CreateInstance(__uuidof(Fun));
if(FAILED(hr))
{
MessageBox("创建COM接口失败!");
return;
}
m_add3 = spFun->Add(m_add1,m_add2);
BSTR s1,s2,s3;
s1 = m_str1.AllocSysString();
s2 = m_str2.AllocSysString();
s3 = spFun->CatString(s1,s2);
m_str3 = convert(s3);
UpdateData(FALSE);
}
如果使用命名空间,程序应该改动如下:
void CExample3Dlg::OnExeBtn() 
{
UpdateData(TRUE);
OBJECTLib::IFunPtr  spFun;
HRESULT hr = spFun.CreateInstance(__uuidof(OBJECTLib::Fun));
if(FAILED(hr))
{
MessageBox("创建COM接口失败!");
return;
}
m_add3 = spFun->Add(m_add1,m_add2);
BSTR s1,s2,s3;
s1 = m_str1.AllocSysString();
s2 = m_str2.AllocSysString();
s3 = spFun->CatString(s1,s2);
m_str3 = convert(s3);
UpdateData(FALSE);
}

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节