每次我尝试将COM指针存储到结构中时,我的程序都会崩溃,然后尝试使用原始指针。我没有调试权限来确切地说出错误。
pRend->cp = cpRT;
ID2D1SolidColorBrush *scBrush;
ERF(cpRT->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::CornflowerBlue), &scBrush));
它在CreateSolidColorBrush上崩溃。但是,如果我注释掉pRend-> cp = cpRT,它就不会。 顺便说一句,pRend-> cp和cpRT的类型为ID2D1HwndRenderTarget *。
答案 0 :(得分:1)
而不是直接分配QI然后存储,即
pRend->cp = cpRT;
应替换为
cpRT->QueryInterface(&pRend->cp);
答案 1 :(得分:0)
目前还不清楚在将其分配到结构中以及稍后在CreateSolidColorBrush中使用它之间存在多少代码。如果这是一个非常重要的时间,你可能会有一个引用计数问题。
您是否在结构中存储了原始指针?如果是这样,将其切换到CComPtr并查看崩溃是否消失。
例如。如果在进行CreateSolidColorBrush调用之前,pRend的值具有以下类型定义(称为Render)并且值pRend已被销毁,则可能会看到此行为。
struct Render {
ID2D1HwndRenderTarget *pCt;
~Render() {
pCt->Release();
}
};
答案 2 :(得分:0)
事实证明,我设法通过分配pRend和malloc来阻止崩溃。这不是问题,因为我不再需要它时会自由呼叫。我很感兴趣为什么调用malloc修复了这个问题。我习惯于Datatype * var;
,然后只使用var
。那不好吗?
答案 3 :(得分:0)
这是一个聪明的指针。我猜测你无意中呼吁释放它。特别是,它的运算符地址(一元运算放大器)被覆盖以调用Release()。
如果您将其分配给参考ID2D1HwndRenderTarget *&。
,请查看会发生什么。显然,如果您指定参考,您将无法重置它。