这在某种程度上与我已经弄清楚的another question that I've asked有关。最后一块拼图是使用CoCreateInstance()而不是GetActiveObject()。我不想使用现有的EnvDTE实例,所以我调用了CoCreateInstance,它会正确地触发一个新的VisualStudio实例。CoCreateInstance()调用AddRef(),我将输出指针存储在CComPtr中,它正确地调用销毁时释放。当这个Release()发生时,看起来VS的实例关闭了!当然,这是因为refcount为零。我想要做的是让新进程拥有最后一个实例,所以当用户使用Close (X)按钮关闭VS时,它将销毁COM对象。
我尝试过以下几种方法: 1.在我的CComPtr上调用Detach(),这样对象就可以继续存在。当然可以,但是,使用close按钮关闭VS实际上并不会终止进程(它仍在任务管理器列表中运行)。2.启动VS的单独进程,然后使用ROT查找新实例。这很难看,因为在尝试查找COM对象的新实例之前,我必须等待应用程序启动一段不确定的时间。3.使用全局或静态CComPtr,在我的应用关闭时手动销毁对象。我不想这样做。
发布于 2009-06-16 22:47:12
因此,我已经针对使用CoCreateInstance创建VisualStudio.DTE对象的特定情况解决了这一问题。返回的DTE对象有一个UserControl属性,该属性可以设置为TRUE。当您将其设置为TRUE时,保存DTE对象的CComPtr的Release()不会销毁实例:
#define RETURN_ON_FAIL( expression ) \
result = ( expression ); \
if ( FAILED( result ) ) \
return false; \
else // To prevent danging else condition
HRESULT result;
CLSID clsid;
CComPtr<IUnknown> punk = NULL;
CComPtr<EnvDTE::_DTE> dte = NULL;
RETURN_ON_FAIL( ::CLSIDFromProgID(L"VisualStudio.DTE", &clsid) );
RETURN_ON_FAIL( ::CoCreateInstance( clsid, NULL, CLSCTX_LOCAL_SERVER, EnvDTE::IID__DTE, (LPVOID*)&punk ) );
dte = punk;
dte->put_UserControl( TRUE );发布于 2009-05-20 04:47:52
看看WindowClosing Event吧。您可以订阅该事件,当该事件被触发时,调用Release()。这将要求您确定要订阅哪些窗口事件。
https://stackoverflow.com/questions/881116
复制相似问题