Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139584
  • 博文数量: 124
  • 博客积分: 70
  • 博客等级: 民兵
  • 技术积分: 1745
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 13:49
文章分类

全部博文(124)

文章存档

2011年(55)

2010年(14)

2009年(30)

2008年(25)

我的朋友

分类: WINDOWS

2008-10-30 17:09:17

 

The following table summarizes the allowable REGCLS value combinations and the object registrations affected by the combinations.

  REGCLS_ SINGLEUSE REGCLS_ MULTIPLEUSE REGCLS_ MULTI_ SEPARATE Other

CLSCTX_INPROC_SERVER

Error

In-process

In-process

Error

CLSCTX_LOCAL_SERVER

Local

In-process/ local

Local

Error

Both of the above

Error

In-process/ local

In-process/ local

Error

Other

Error

Error

Error

Error

 
上述内容来自于msdn。
 
我个人对REGCLS 的标记位非常困惑,所以通过一些自己的例子代码来展示。
 
我准备了一个mfc的dialog client exe 程序。client
一个atl向导生成的local_server exe ,注意不是服务。 Itestservice
一个进程内组建innerobj.
 
然后client 创建进程外com创建 Itestservice, 而Itestservice 提供了一个方法test
这个方法又创建了 Itestservice.
 
类厂以此种方式注册
hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER,
   REGCLS_MULTI_SEPARATE);
 
结果发现,如果testservice
因此暂时理解msdn说的,REGCLS_MULTI_SEPARATE需要主动设置环境,因为没有人帮你注册。
 
以如下方式创建,则hr表示无此注册信息。
CComPtr spObj;
 HRESULT hr =::CoCreateInstance(__uuidof(testservice) ,
  NULL ,
CLSCTX_INPROC_SERVER ,
 __uuidof(testservice) ,
  (VOID **)&spObj);
 return hr;
 
如果以一下方式创建则成功
CComPtr spObj;
 HRESULT hr =::CoCreateInstance(__uuidof(testservice) ,
  NULL ,
  CLSCTX_LOCAL_SERVER,
  __uuidof(testservice) ,
  (VOID **)&spObj);
 return hr;
 
如果以一下方式创建则也成功
CComPtr spObj;
 HRESULT hr =::CoCreateInstance(__uuidof(testservice) ,
  NULL ,
 CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
  __uuidof(testservice) ,
  (VOID **)&spObj);
 return hr;
 
后两种方式都将在exe的进程内创建一个testservice类的新instance , 貌似看不出什么区别。
 
以第2,3种方式时候,如果将testservice设置为类工厂单件,那么创建时候将失败E_NOINTERFACE.
 
不过如果是外部client创建,那么类工厂singlton将生效。
 
 
 
到了这儿,我对这个标记位还是一知半解,不过先跳过,看看SINGLEUSER这个标记和类厂单件的关系。
hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER,
   REGCLS_SINGLEUSE);
 
创建方式还是同上3种。
 
2,3 这种方式成功,且启动了一个新的进程。无所谓单件,因为类厂仅被看到一次。
1 失败。 确实符合msdn的local说明。
 
最后需要说明,由于single这种模式,类厂看到一次,因此在exe内部如果需要get Itestservice那么不能再像进程内sdk那样通过 ::CocreateInstance了。只能通过保存接口方式,或者其它模式了。
 
阅读(1036) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~