WEB开发网      濠电娀娼ч崐濠氬疾椤愶附鍋熸い鏍ㄧ〒闂勫嫰鏌﹀Ο渚Ц闁诲氦顕ч湁婵犲﹤楠告禍鍓х磼鏉堛劌绗氶柟宄版嚇閹晠宕归銈嗘濠电偞鍨堕幐鎾磻閹捐秮褰掓偐閻戞﹩妫勯梺鎼炲妼鐎涒晝绮嬪澶樻晝闁挎繂鏌婇敃鍌涚厵閻庢稒锚閻忥絾绻濇繝鍐ㄧ伌闁诡垰鍟村畷鐔碱敂閸♀晙绱樺┑鐐差嚟婵儳螞閸曨剚鍙忛柍鍝勬噹缁€澶嬬箾閹存繄锛嶆鐐灲閹綊宕惰濡插鏌涢妸銉ヮ劉缂佸倸绉归弫鎾绘晸閿燂拷 ---闂備焦瀵уú鈺呭箯閿燂拷
开发学院软件开发VC COM编程入门:深入COM服务器 阅读

COM编程入门:深入COM服务器

 2006-07-21 11:44:59 来源:WEB开发网 闂備線娼уΛ鎾箯閿燂拷闂備礁鎲¢崹鐢垫崲閹扮増鍎嶆い鎺戝€甸崑鎾斥槈濞嗗秳娌紓鍌氱▌閹凤拷濠电姭鎷冮崨顓濈捕闂侀潧娲ゅú銊╁焵椤掍胶鈯曢柕鍥╁仧缁辩偤鏁撻敓锟�闂備線娼уΛ鎾箯閿燂拷  闂備胶枪缁绘鈻嶉弴銏犳瀬闁绘劕鎼痪褔鏌曟繝蹇曠窗闁煎壊浜滈—鍐偓锝庡墮娴犙勭箾閸喎鐏ユい鏇樺劦椤㈡瑩鎮℃惔銇帮拷
核心提示: riid 和ppv 与在QueryInterface()中的用法一样——它们是客户端所请求的接口IID和存储接口指针的指针缓冲,下面是CreateInstance()的实现,COM编程入门:深入COM服务器(10),它从参数的有效性检查和参数的初始化开始,HRESU

riid 和ppv 与在QueryInterface()中的用法一样——它们是客户端所请求的接口IID和存储接口指针的指针缓冲。

下面是CreateInstance()的实现。它从参数的有效性检查和参数的初始化开始。

HRESULT CSimpleMsgBoxClassFactory::CreateInstance ( IUnknown* pUnkOuter,
                          REFIID  riid,
                          void**  ppv )
{
  // 因为不支持聚合,所以这个参数pUnkOuter必须为NULL.
  if ( NULL != pUnkOuter )
    return CLASS_E_NOAGGREGATION;
  //检查指针ppv是不是void*类型
  if ( IsBadWritePtr ( ppv, sizeof(void*) ))
    return E_POINTER;
  *ppv = NULL;
检查完参数的有效性后,就可以创建一个新的对象了。
CSimpleMsgBoxImpl* pMsgbox;
  // 创建一个新的COM对象
  pMsgbox = new CSimpleMsgBoxImpl;
  if ( NULL == pMsgbox )
    return E_OUTOFMEMORY;
最后,用QI()来查询客户端所请求的新对象的接口。如果QI()失败,则这个对象不可用,必须删除它。
HRESULT hrRet;
  // 用QI查询客户端所请求的对象接口
  hrRet = pMsgbox->QueryInterface ( riid, ppv );
  // 如果QI失败,则删除这个COM对象,因为客户端不能使用它(客户端没有
  //这个对象的任何接口)
  if ( FAILED(hrRet) )
    delete pMsgbox;
  return hrRet;
}

深入DllGetClassObject()

现在让我们深入DllGetClassObject()内部。它的原型是:

上一页  5 6 7 8 9 10 

Tags:COM 编程 入门

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