这与我问过的另一个问题有点相关,我已经很清楚了。最后一块拼图是使用 CoCreateInstance() 而不是 GetActiveObject()。我不想使用现有的 EnvDTE 实例,所以我调用 CoCreateInstance,它会正确触发 VisualStudio 的新实例。CoCreateInstance() 调用 AddRef() 并将输出指针存储在 CComPtr 中,它在销毁时正确调用 Release。当这个 Release() 发生时,你瞧,VS 的实例就关闭了!当然会,因为引用计数为零。我想要做的是让新进程拥有最后一个实例,因此当用户使用关闭 (X) 按钮关闭 VS 时,它将破坏 COM 对象。
我尝试了一些事情: 1. 在我的 CComPtr 上调用 Detach(),这样对象就会继续存在。当然可以,但是,使用关闭按钮关闭 VS 并不会真正终止进程(它仍在任务管理器列表中运行)。2. 启动一个单独的VS进程,然后使用ROT找到新的实例。这很难看,因为在尝试查找 COM 对象的新实例之前,我必须等待应用程序启动的不确定时间。3. 使用全局或静态 CComPtr,并在我的应用关闭时手动销毁对象。我宁愿不这样做。