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】