WEB开发网
开发学院软件开发VC COM编程入门:深入COM服务器 阅读

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

 2006-07-21 11:44:59 来源:WEB开发网   
核心提示: HRESULT CUnknownImpl::QueryInterface ( REFIID riid, void** ppv ){HRESULT hrRet = S_OK;// 标准QI()初始化 – 置 *ppv 为 NULL.*ppv = NULL;// 如果客户端请求提供

HRESULT CUnknownImpl::QueryInterface ( REFIID riid, void** ppv )
{
HRESULT hrRet = S_OK;
  // 标准QI()初始化 – 置 *ppv 为 NULL.
  *ppv = NULL;
  // 如果客户端请求提供的接口,给 *ppv.赋值
  if ( IsEqualIID ( riid, IID_IUnknown ))
    {
    *ppv = (IUnknown*) this;
    }
  else
    {
    // 不提供客户端请求的接口
    hrRet = E_NOINTERFACE;
    }
  // 如果返回一个接口指针。 调用AddRef()增加引用计数.
  if ( S_OK == hrRet )
    {
    ((IUnknown*) *ppv)->AddRef();
    }
  return hrRet;
}
在QI()中做了三件不同的事情:
1、初始化传入的指针为NULL[*ppv = NULL;]。
2、检查riid,确定组件对象类(coclass)实现了客户端所请求接口.
[if ( IsEqualIID ( riid, IID_IUnknown ))]
3、如果确实实现勒索请求的接口,则增加COM对象的引用计数。
[((IUnknown*) *ppv)->AddRef();]
AddRef()调用很关键。
  *ppv = (IUnknown*) this;

要创建新的COM对象引用,就必须调用这个函数通知COM对象这个新引用成立。在AddRef()调用中的强制转换IUnknown*看起来好像多余,但是在QI()中初始化的*ppv有可能不是IUnknown*类型,所以最好是养成习惯对之进行强行转换。。

上面我们已经讨论了一些DLL服务器的内部细节,接下来让我们回头看一看当客户端调用CoCreateInstance()时是如何处理服务器的。

深入CoCreateInstance()

在本文的第一部分中,我们见过CoCreateInstance()API,其作用是当客户端请求对象时,用它来创建对象。从客户端的立场看,它是一个黑盒子。只要用正确的参数调用它即可得到一个COM对象。它并没有什么魔法,只是在一个定义良好的过程中加载COM服务器,创建请求的COM对象并返回所要的指针。就这些。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:COM 编程 入门

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