设为首页 加入收藏

TOP

向ATL的DLL中传递C++对象参数(二)
2012-11-04 15:09:31 来源: 作者: 【 】 浏览:423
Tags:ATL DLL 传递 对象 参数
  下一步如下:

  1、创建一个COM接口,
  2、创建一个SAFEARRAY对象,
  3、在IDL文件中定义:

[helpstring("method SetArray")]
HRESULT SetArray([in]SAFEARRAY (unsigned char) pData);[helpstring("method GetArray")]
HRESULT GetArray([out/*,retval*/]SAFEARRAY(unsigned char) *pData);

   4、创建一个基于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++(www.cppentry.com)对象。我要感谢William Rubin,他的文章对我帮助很大,我曾经计划把这个主题解释的更详细,但由于时间不足我无法完成,然而我会不断的更新这篇文章,在这期间,请不用客气的跟我联系。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC下动态数据交换技术之永久数据.. 下一篇VC下动态数据交换技术之DDE数据传..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: