首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EnvDTE的CoCreateInstance没有AddRef()?

EnvDTE的CoCreateInstance没有AddRef()?
EN

Stack Overflow用户
提问于 2009-05-19 05:37:23
回答 2查看 720关注 0票数 1

这在某种程度上与我已经弄清楚的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,在我的应用关闭时手动销毁对象。我不想这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-16 22:47:12

因此,我已经针对使用CoCreateInstance创建VisualStudio.DTE对象的特定情况解决了这一问题。返回的DTE对象有一个UserControl属性,该属性可以设置为TRUE。当您将其设置为TRUE时,保存DTE对象的CComPtr的Release()不会销毁实例:

代码语言:javascript
复制
#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 );
票数 1
EN

Stack Overflow用户

发布于 2009-05-20 04:47:52

看看WindowClosing Event吧。您可以订阅该事件,当该事件被触发时,调用Release()。这将要求您确定要订阅哪些窗口事件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/881116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档