首页 > 解决方案 > 释放 COM 指针的异常

问题描述

我正在进入read access violation exceptionBase析构函数,因为root_dse之后超出范围CoUninitialize();

#include <atlbase.h>
#include <ActiveDS.h>
#include <memory>

#pragma comment(lib, "activeds.lib")
#pragma comment(lib, "adsiid.lib")

using namespace std;

class Base {
protected:
    CComPtr<IADs> root_dse = nullptr;
public:
    Base()
    {
        CoInitialize(nullptr);
    }
    virtual ~Base()
    {
        CoUninitialize();
    }
    virtual void do_stuff() = 0;
};

class Derived : public Base {
private:
    void do_stuff() override {
        const auto h_result = ADsOpenObject(L"LDAP://rootDSE",
            NULL,
            NULL,
            ADS_SECURE_AUTHENTICATION,
            IID_IADs,
            (void**)&root_dse);
    }
};

int main() {
    std::shared_ptr<Base> base = std::make_shared<Derived>();
    base->do_stuff();
    return 0;
}

我怎样才能确保这root_dserelease之前CoUninitialize();避免的read access violation exception
注意:所有派生类都在使用root_dse,所以它应该在Base类中。

标签: c++com

解决方案


推荐阅读