错误截图
其中 ScopedCOMInitializer 实现如下:
class ScopedCOMInitializer {
public:
enum SelectMTA { kMTA };
ScopedCOMInitializer() { Initialize(COINIT_APARTMENTTHREADED); }
explicit ScopedCOMInitializer(SelectMTA mta) {
Initialize(COINIT_MULTITHREADED);
}
~ScopedCOMInitializer() {
if (SUCCEEDED(hr_))
CoUninitialize();
}
bool succeeded() const { return SUCCEEDED(hr_); }
private:
void Initialize(COINIT init) {
hr_ = CoInitializeEx(NULL, init);
}
HRESULT hr_;
ScopedCOMInitializer(const ScopedCOMInitializer&);
void operator=(const ScopedCOMInitializer&);
};
所以问题是 CoInitializeEx 返回了 “0x80010106”。
问题分析及定位
- 在 COM + 线程模型 中发现以下描述:
- 关于 CoInitializeEx 的api说明中,描述了返回RPC_E_CHANGED_MODE的场景:
- 综上所述,我如果在主线程调用CoInitializeEx,主线程被置为STA模式,而我在 CoInitializeEx 处设置 MTA,触发以上错误返回。
解决方法
- 在子线程中调用 CoInitializeEx 。