C++ 自动化visual studio时智能指针的使用
我使用下面的代码来操作VisualStudio 除了智能指针在函数退出之前没有正确释放外,其他一切都正常工作:它在释放时引发异常:异常0xc0000005,写入0xfeeefeee时访问冲突 运行停止在下面的粗体部分C++ 自动化visual studio时智能指针的使用,c++,C++,我使用下面的代码来操作VisualStudio 除了智能指针在函数退出之前没有正确释放外,其他一切都正常工作:它在释放时引发异常:异常0xc0000005,写入0xfeeefeee时访问冲突 运行停止在下面的粗体部分 public: typedef T _PtrClass; ~CComPtrBase() throw() { if (p) p->Release(); } 谁能给我一些提示吗 int myAutomate
public:
typedef T _PtrClass;
~CComPtrBase() throw()
{
if (p)
p->Release();
}
谁能给我一些提示吗
int myAutomateVS()
{
CoInitialize(NULL);
CComPtr<IRunningObjectTable> pTable=NULL;
GetRunningObjectTable(0, &pTable);
CComPtr<IEnumMoniker> pEnumMoniker=NULL;;
pTable->EnumRunning(&pEnumMoniker);
CComPtr<IMoniker> pMoniker=NULL;
ULONG nMoniker=0;
CComPtr<IUnknown> pRunningObj=NULL;
while(pEnumMoniker->Next(1, &pMoniker, &nMoniker) == S_OK)
{
CComPtr<IBindCtx> pCtx=NULL;
CreateBindCtx(0, &pCtx);
LPOLESTR pwszName;
pMoniker->GetDisplayName(pCtx, NULL, &pwszName);
pTable->GetObject(pMoniker, &pRunningObj);
if(_tcsstr(pwszName, L"VisualStudio.DTE.8") != NULL)
break;
}
CComPtr<EnvDTE::_DTE> pDTE;
pDTE = pRunningObj;
CComPtr<EnvDTE::_Solution> solution;
pDTE->get_Solution(&solution);
CComBSTR fullName;
solution->get_FullName(&fullName);
CoUninitialize();
return 0;
}
引发了哪个异常?异常是:0xc0000005,写入0xfeeefeee的访问冲突。您的复制构造函数和赋值运算符在哪里?您成为了一个典型错误的受害者-当持有接口指针的CComPtr对象仍在作用域中时,您调用conInitialize。他们将在右大括号中调用其底层哑指针的Release,但在conInitializeptable->GetObjectpMoniker,&pRunningObj;此漏洞-pRunningObj当前持有的接口指针被覆盖,并且从未释放。