在结构中存储COM指针

时间:2009-04-05 14:07:54

标签: c++ com struct pointers

每次我尝试将COM指针存储到结构中时,我的程序都会崩溃,然后尝试使用原始指针。我没有调试权限来确切地说出错误。

pRend->cp = cpRT;

ID2D1SolidColorBrush *scBrush;
ERF(cpRT->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::CornflowerBlue), &scBrush));

它在CreateSolidColorBrush上崩溃。但是,如果我注释掉pRend-> cp = cpRT,它就不会。 顺便说一句,pRend-> cp和cpRT的类型为ID2D1HwndRenderTarget *。

4 个答案:

答案 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 *&。

,请查看会发生什么。

显然,如果您指定参考,您将无法重置它。