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