向ATL DLL中传递C++对象
2006-07-22 22:53:06 来源:WEB开发网核心提示: 下一步如下: 创建一个COM接口, 创建一个SAFEARRAY对象,向ATL DLL中传递C++对象(2), 在IDL文件中定义: [helpstring("method SetArray")]HRESULT SetArray([in]SAFEARRAY (unsign
下一步如下:
- 创建一个COM接口,
- 创建一个SAFEARRAY对象,
- 在IDL文件中定义:
[helpstring("method SetArray")]
HRESULT SetArray([in]SAFEARRAY (unsigned char) pData);[helpstring("method GetArray")]
HRESULT GetArray([out/*,retval*/]SAFEARRAY(unsigned char) *pData); - 创建一个基于MFC的客户机来测试该应用程序 你的IDL文件应该象这样:
interface IBolbData : IUnknown
{
[helpstring("method SetArray")] HRESULT SetArray([in]SAFEARRAY
(unsigned char) pData);
[helpstring("method GetArray")] HRESULT GetArray([out/*,retval*/]
SAFEARRAY(unsigned char) *pData);
};
// 设定对象
STDMETHODIMP CBolbData::SetArray(SAFEARRAY *pData)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// 创建CSimpleObj的亚元指针
CSimpleObj *dummy=NULL;
// 创建 blob 对象 用来填充、反序列化
CBlob blob;
// 使用 safearray 创建亚元对象
blob.Expand( (CObject*&)dummy, pData );
dummy->Show(); // 调用显示函数测试对象
delete dummy; //删除指针
return S_OK;
}
// 创建对象 并发送给客户机.
STDMETHODIMP CBolbData::GetArray(SAFEARRAY **pData)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// 创建对象并发送给服务器
CSimpleObj *pMyOb = new CSimpleObj();
//设定字符串数据
pMyOb->SetString( "A SAFEARRAY from the server!" );
// 创建blob来序列化对象
CBlob blob;
// 将对象载入blob
*pData = blob.Load( pMyOb );
// 删除pMyOb指针
delete pMyOb;
return S_OK;
}
最后,写一个有两个按钮的基于对话框的 MFC 应用程序 并添加如下代码: void CClientDlg::OnOK()
{
// 从CLSID串创建COM智能指针
try
{
IBolbDataPtr pI( "Server.BolbData.1" );
SAFEARRAY *psa ;
// 从服务器取得 safearray
pI->GetArray( &psa );
// 创建指针
CSimpleObj *dummy=NULL;
// blob 对象
CBlob blob;
//使用blob 扩展 safearray 到一个对象里
blob.Expand( (CObject *&)dummy, psa );
//通过调用一个对象的方法来测试它
dummy->Show();
// 删除对象
delete dummy;
}
// 通过智能指针处理任意 COM 异常
catch (_com_error e)
{
// 显示错误信息
AfxMessageBox( e.ErrorMessage() );
}
}
void CClientDlg::OnLoad()
{
try
{
// 从CLSID 串创建智能指针
IBolbDataPtr pI( "Server.BolbData.1" );
SAFEARRAY *psa ;
// 创建送给服务器的对象
CSimpleObj *pMyOb = new CSimpleObj();
// 设置字符串数据
pMyOb->SetString( "The client sent a SAFEARRAY!" );
// 创建 blob 用来序列化对象
CBlob blob;
// 将对象载入到 blob
psa = blob.Load( pMyOb );
//删除对象
delete pMyOb;
pI->SetArray( psa );
}
catch (_com_error e)
{
// 显示错误信息
AfxMessageBox( e.ErrorMessage() );
}
}
总结这篇文章包含了很多的主题:例如 怎样使用序列化,怎样使用 SAFEARRAY,和怎样通过接口传递C++对象。我要感谢William Rubin,他的文章对我帮助很大,我曾经计划把这个主题解释的更详细,但由于时间不足我无法完成,然而我会不断的更新这篇文章,在这期间,请不用客气的跟我联系。
更多精彩
赞助商链接