![]() |
1
15
如果希望使用与COM对象不同的线程模型从应用程序调用COM对象,则需要代理/存根。 例如,我们有一个插件,该插件由使用特定线程模型的应用程序加载(不记得是哪个),但我们的COM对象是多线程单元(MTA),因此在进行函数调用时,代理/存根需要整理对象之间的数据,同时还要遵守线程模型的规则。 如果这些规则被破坏,那么COM将抛出异常或返回一个失败的hresult,例如 rpc-e-u错误的线程 如果不选中“合并代理/存根”选项,则Visual Studio将为代理/存根生成一个单独的项目,该项目将生成一个单独的dll。如果需要的话,这会使部署更加困难,但是如果不受线程模型问题的影响,基本上可以忽略它们。 因此,如果调用COM对象的应用程序使用与对象相同的线程模型,则可以不使用代理/存根。 Larry Osterman对 threading models 在他的博客上。 |
![]() |
2
3
此外,如果您的接口只包含类型库友好类型(BSTR、variant等),并且出现在IDL的库块中,则可以选择将它们“类型库编组”,这意味着系统提供的代理/存根使用类型库中的元数据。 当接口被放入库块中,并且dllRegisterServer被自定义为注册类型库时(如果我正确调用,则将true传递给xxxmodule::dllRegisterServer),系统将根据John Sibly的描述对您的接口进行编组(如果需要)。
此时,代理/存根甚至都没有使用,所以
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 4 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 4 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 4 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 5 月前 |