Хранение указателя COM в структуре - PullRequest
0 голосов
/ 05 апреля 2009

Моя программа падает каждый раз, когда я пытаюсь сохранить COM-указатель в структуре, а затем позже пытаюсь использовать исходный указатель. У меня нет доступа к отладке, чтобы точно сказать, что не так.

pRend->cp = cpRT;

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

Сбой при CreateSolidColorBrush. Однако, если я закомментирую pRend-> cp = cpRT, это не так. Кстати, pRend-> cp и cpRT имеют тип ID2D1HwndRenderTarget *.

Ответы [ 4 ]

1 голос
/ 06 апреля 2009

Вместо непосредственного присвоения QI и последующего сохранения, т.е.

pRend->cp = cpRT;

следует заменить на

cpRT->QueryInterface(&pRend->cp);
0 голосов
/ 05 апреля 2009

Как оказалось, мне удалось остановить сбой, выделив pRend с помощью malloc. Это не проблема, потому что я позвоню бесплатно, когда мне это больше не нужно. Мне интересно, почему вызов malloc исправляет это. Я привык просто делать Datatype * var;, а затем просто var. Это плохо?

0 голосов
/ 05 апреля 2009

Это умный указатель. Я догадываюсь , что вы случайно вызываете релиз. В частности, его адрес оператора (унарный оператор &) переопределяется для вызова Release ().

Посмотрите, что произойдет, если вместо этого назначить ссылку, ID2D1HwndRenderTarget * &.

Очевидно, что если вы назначите ссылку, вы не сможете переустановить ее.

0 голосов
/ 05 апреля 2009

Неясно, сколько существует кода между тем, когда вы назначаете его в структуру и позже используете его в CreateSolidColorBrush. Если это не тривиальный промежуток времени, возможно, у вас есть проблема с подсчетом ссылок.

Вы храните необработанный указатель в структуре? Если это так, переключите его на CComPtr и посмотрите, исчезнет ли сбой.

Например. Если у вас было следующее определение типа для значения pRend (назовите его Render), а значение pRend было уничтожено перед вызовом CreateSolidColorBrush, вы могли увидеть это поведение.

struct Render { 
  ID2D1HwndRenderTarget *pCt;
  ~Render() {
    pCt->Release();
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...