gpt4 book ai didi

c++ - 使用 CoInitialize 和 CoUninitialize 抛出 C++ 异常

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:45 24 4
gpt4 key购买 nike

我有这样一个函数:

bool op1();
bool op2();

bool foo() {
CoInitialize(nullptr);
if (!op1()) {
CoUninitialize();
return false;
}
// do more stuff, then call op2...
if (!op2()) {
CoUninitialize();
return false;
}
// happy path
CoUninitialize();
return true;
}

我想重构 foo() 以抛出异常:

void foo() {
CoInitialize(nullptr);
if (!op1()) {
CoUninitialize(); // I'm lazy, can't I automate this call?
throw std::exception("Failed");
}
// ...

但每次出现错误时我都必须调用 CoUninitialize()

我考虑过将 COM init 调用包装在一个类中,所以析构函数 will do the cleanup ,但是有一个未使用的对象对我来说感觉很奇怪:

class comlib {
public:
comlib() { CoInitialize(nullptr); }
~comlib() { CoUninitialize(); } // automated!
};

void foo() {
comlib nobodyEverCallsMe;
if (!op1()) {
throw std::exception("Failed");
}
// ...

有更好的方法吗?

最佳答案

陈峰已using this method一段时间所以我确定它没问题,只要记住仅在 CoInitialize SUCCEEDED 时调用 CoUninitialize!

class CCoInitialize {
HRESULT m_hr;
public:
CCoInitialize() : m_hr(CoInitialize(NULL)) { }
~CCoInitialize() { if (SUCCEEDED(m_hr)) CoUninitialize(); }
operator HRESULT() const { return m_hr; }
};


void Something()
{
CCoInitialize init;
...
}

有些人可能想在 CoInitialize 失败时抛出构造函数,但我觉得这是不必要的,因为其他 COM 调用会失败。仅当您需要从 CoInitialize 中捕获准确的 HRESULT 失败代码时才这样做。

关于c++ - 使用 CoInitialize 和 CoUninitialize 抛出 C++ 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com