xMR*_*MRi 5 com multithreading
当我将CoRegisterClassObject与CLSCTX_INPROC_SERVER和REGCLS_MULTIPLEUSE一起使用时,主线程使用CLSCTX_ALL创建对象时,出现错误“类未注册”。
当我将CoRegisterClassObject与CLSCTX_LOCAL_SERVER和REGCLS_MULTIPLEUSE一起使用时,主线程可以创建该对象。但是程序的下一个实例将在第一个进程内创建thze对象。
在CoCreateInstance中使用CLSCTX_INPROC标志将始终表示未注册该类。
顺便说一句:因为我总是在程序启动时自己注册该类,所以除了所需的typelib以外,没有其他注册表项。
我为什么需要这样做的更详细的解释:创建的类使用在EXE上下文中内部创建的指针和函数。试想一下,我正在编程一个“应用程序”对象,该对象应仅支持该进程内部的功能以及此会话管理的文件和对象。我需要这个COM对象,因为它在VBScripting Host内部使用,并且再次暴露给其他COM对象。
有没有办法注册仅支持从我的EXE内部创建的类工厂?
这里的问题是CLSCTX_INPROC_SERVER使注册仅对呼叫公寓“可见”,而下一个选项CLSCTX_LOCAL_SERVER使其跨公寓跨进程。也就是说,正如您所发现的,没有特定选项跨公寓但在进程内,以便 2 个以上进程可以在其进程范围内公开类对象。
此外,它看起来CoRegisterClassObject与注册本身一起指示 COM 使用调用的单元进行进一步实例化,这可以防止在可能被阻止的线程上进行注册,甚至防止这些单元参与指针的编组。
解决方法是使用进程特定名称通过运行对象表公开类对象。标准RegisterActiveObject将使用“!{CLSID}”名称,并且您对“!{CLSID}-processid”之类的名称感兴趣(这种灵活性可以通过IRunningObjectTable::RegisterROT 注册而不是RegisterActiveObject获得),以便单独的进程可以查找自己的对象。从侧面 STA 线程调用 ROT 注册将导致那里的封送调用直接绕过“阻塞”的主 STA。
| 归档时间: |
|
| 查看次数: |
737 次 |
| 最近记录: |