如何将COM主机对象公开给VSTA加载项?

时间:2014-05-19 04:00:23

标签: visual-studio-2012 vsta host-object

是否有人将VSTA 2.0加载项开发升级到VSTA 2012?如果是的话,

请您帮我解决这个问题"如何将我的COM主机对象暴露给VSTA加载项?"

我正在使用VSTA 2012,VSTA 2012附带的示例应用程序" MyVSTAHost"不包括将主机对象暴露给vsta加载项。

在vsta 2.0中,shapeappadvancedmfc涵盖了这一点,但我不再能够在vsta 2012中使用hostitemprovider和contract概念,因为它在vsta 2012中不再受支持。

注意:在VSTA 2.0中,我能够使用加载项调用我的宿主应用程序dispinterface方法但是在VSTA 2012中知道如何做,我没有看到VSTA 2012中的poxygen和一些运行时命名空间的支持VSTA 2012不再支持。

谢谢和问候,

Nayaz

1 个答案:

答案 0 :(得分:-1)

使用Visual Studio包模板:

  

非托管VSPackage(包括由Visual Studio包模板生成的版本)使用ATL样式的.rgs文件来存储注册信息。 .rgs文件格式特定于ATL,通常不能由安装创作工具按原样使用。必须单独维护VSPackage安装程序的注册信息。例如,开发人员可以将.reg格式的文件与.rgs文件更改同步。 .reg文件可以与RegEdit合并以进行开发工作或由安装程序使用。

     

有时,COM接口会生成一个IUnknown对象,然后COM接口将其作为void **类型传递。这些接口尤为重要,因为如果在IDL中将变量定义为[out],则使用AddRef方法对IUnknown对象进行引用计数。如果未正确处理对象,则会发生内存泄漏。

     

由COM接口创建并在[out]变量中返回的IUnknown对象如果未明确释放则会导致内存泄漏。

     

处理此类对象的托管方法应将IntPtr视为指向IUnknown对象的指针,并调用GetObjectForIUnknown方法以获取该对象。然后调用者应该将返回值强制转换为适当的任何类型。当不再需要该对象时,请调用Release以释放它。

     

在Visual Studio 2015中,它们已经消失(没有“工具”>“加载项管理器”菜单)。因此,您必须将加载项迁移到程序包,这可能是一项非常艰巨的任务,具体取决于加载项的大小和复杂性(仅通过您仍然可以使用自动化模型(EnvDTE)的事实来缓解包裹。

<强>参考