WEB开发网
开发学院软件开发VC 向ATL DLL中传递C++对象 阅读

向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

下一步如下:

  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++对象。我要感谢William Rubin,他的文章对我帮助很大,我曾经计划把这个主题解释的更详细,但由于时间不足我无法完成,然而我会不断的更新这篇文章,在这期间,请不用客气的跟我联系。

上一页  1 2 

Tags:ATL DLL 传递

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接