C++ 自动化visual studio时智能指针的使用

C++ 自动化visual studio时智能指针的使用,c++,C++,我使用下面的代码来操作VisualStudio 除了智能指针在函数退出之前没有正确释放外,其他一切都正常工作:它在释放时引发异常:异常0xc0000005,写入0xfeeefeee时访问冲突 运行停止在下面的粗体部分 public: typedef T _PtrClass; ~CComPtrBase() throw() { if (p) p->Release(); } 谁能给我一些提示吗 int myAutomate

我使用下面的代码来操作VisualStudio

除了智能指针在函数退出之前没有正确释放外,其他一切都正常工作:它在释放时引发异常:异常0xc0000005,写入0xfeeefeee时访问冲突

运行停止在下面的粗体部分

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当前持有的接口指针被覆盖,并且从未释放。