Articles of com interop

为什么我会使用“Both”COM线程模型而不是“Free”?

根据这篇文章,如果我注册我的COM对象与“两个”或“自由”的线程模型,该对象必须是完全线程安全的。 具体来说,所有对全局共享variables的访问都必须同步,并且所有对成员variables的访问也必须同步。 这是很多努力。 现在我明白了,能够注册我的对象为使用“免费”线程模型是有利的,可能值得付出代价,使其完全线程安全。 但为什么我想要做同样的事情,并使用“Both”线程模型来注册我的对象呢? 什么是优势? 我如何select“两者”和“免费”?

在IDL中将IUnknown派生的接口标记为dual有什么意义?

回顾我们的代码,我在.idl文件中find了一个好奇的定义: [ object, uuid(uuidhere), dual, nonextensible, oleautomation, hidden ] interface IOurInterface : IUnknown { //methods here }; 一个从IUnknown直接派生的接口怎么可能是一个双接口? 如果我删除dual属性,会有什么破?

我如何configurationDCOM将我的DLL加载到一个单独的进程?

我试图强制一个现有的本地C + + ATL in-proc COM服务器到一个单独的进程。 我希望DCOM可以做到这一点,而无需更改COM服务器。 我开始使用通常的registry设置 – 我有一个HKCR \ CLSID {classId}条目和一个InProcServer32键指定.dll文件的path。 我生成了一个应用程序ID(GUID)并将其添加到这里和那里。 具体来说,我在HKCR \ CLSID {classId}下添加了一个等同于应用程序ID的string值“AppId”。 我还添加了一个HKCR \ AppId {applicationId}键和一个string值“DllSurrogate”等于一个空string。 我认为这足以迫使我的COM服务器进入一个默认的系统提供的代理。 DCOM应用程序出现在DCOMconfiguration控制台中。 但是,当我调用CoCreateInstance()或CoGetClassObject()并提供类ID和CLSCTX_LOCAL_SERVER它返回“类未注册”。 我究竟做错了什么? UPD:解决。 所采取的步骤足以使其工作,除了我编辑registry的错误的类ID由于某种原因在InProcServer32键下有相同的path – 也许这是一个COM地狱问题。

什么是实施托pipe属性处理程序shell扩展的正确方法?

现在,.NET CLR 4.0支持并行(SxS)操作,现在应该可以在托pipe代码中编写shell扩展了。 我已经尝试过,并成功地编写了一个Property Handler,它实现了IPropertyStore,IInitializeWithStream和IPropertyStoreCapabilities。 处理程序工作正常,并通过浏览器浏览文件时按预期调用。 在显示预览面板和文件属性“详细信息”面板中的自定义属性时,它也可以正常工作。 但是,当我尝试在预览面板中编辑属性,然后单击“保存”时,出现“文件正在使用”错误,说该文件在Windows资源pipe理器中打开。 一些花絮: 当资源pipe理器调用IInitializeWithStream.Initialize时,STGM属性被设置为STGM_SHARE_DENY_WRITE。 而资源pipe理器在任何时候都不会调用IPropertyStore.SetValue或IPropertyStore.Commit。 我看到在不同的线程对我的处理程序重复调用相同的文件属性。 那么,我需要改变(或在registry中设置)以使财产保存工作? 更新: 感谢本,我有它的工作。 “困难的部分”(至less对我来说)是理解COM互操作将永远不会调用我的PropertyHandler上的Dispose或Finalize。 这是我打开的文件,直到GC运行。 幸运的是,“属性处理程序协议”的工作原理是当为ReadValue()调用IInitializeWithSream.Initialize()时,streamMode是ReadOnly,当调用SetValue()时,streamMode将被调用ReadWrite和Commit()最后。 int IInitializeWithStream.Initialize( IStream stream, uint grfMode ) { _stream = stream; _streamMode = (Stgm)grfMode; Load(); // We release here cause if this is a read operation we won't get called back, // and our finializer isn't called. […]

如何为第三方定义的COM接口注册代理/存根?

还有另外一家公司运送消耗内联公司接口的产品。 我们想发布一个实现IAnotherCompanyInterface的COM对象。 该接口不是自动化兼容的,所以启用编组的下一个最简单的选项是使用代理/存根。 另一家公司不运送代理/存根,不想。 编译和注册代理/存根本身不是问题,但考虑以下情况。 有我们的公司出货一个COM对象实现IAnotherCompanyInterface和ThirdPartyCompany相同。 因此,这两个组件可能最终被部署在同一台机器上。 代理/存根注册是系统范围内的一个接口。 他们的代理/存根实现应该如何共同驻留?

COM +库应用程序的目的是什么?

创buildCOM +应用程序时,向导会提供在库和服务器应用程序之间进行select。 一个服务器应用程序在一个单独的进程中被激活,这可以用来廉价地使64位消费者与32位进程内COM组件互操作。 在调用者进程中被激活的库应用程序有什么用处? 为什么使用它们而不是简单的旧的进程内COM服务器?

如何find从Interop DLL工作的COM DLL安装

我有一个引用COM DLL的项目,Interop程序集在我的项目中是可用的,但是我想find实际的COM DLL和依赖关系,这样我就可以构build一个完整的部署包。 只是在Regedit中searchregistry,还有什么我可以做的,以抓住这个COM包?