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了。只能通过保存接口方式,或者其它模式了。
阅读(1124) | 评论(0) | 转发(0) |