Lagring av en COM peker i en struct

stemmer
0

Mitt program krasjer hver gang jeg prøver å lagre et COM peker til en struct, og senere prøver å bruke den originale pekeren. Jeg har ikke debug tilgang til å fortelle nøyaktig hva som er galt.

pRend->cp = cpRT;

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

Det krasjer på CreateSolidColorBrush. Men hvis jeg kommentere ut pRend-> cp = Innr, det gjør det ikke. Forresten, pRend-> cp og Innr er av typen ID2D1HwndRenderTarget *.

Publisert på 05/04/2009 klokken 14:07
kilden bruker
På andre språk...                            


4 svar

stemmer
1

I stedet for å tildele direkte QI og deretter lagre dvs.

pRend->cp = cpRT;

bør erstattes med

cpRT->QueryInterface(&pRend->cp);
Svarte 06/04/2009 kl. 01:16
kilden bruker

stemmer
0

Det er en smart pekeren. Jeg gjetter du uhell kaller utgivelsen på den. Spesielt er det addressof operatør (ensartet op &) er overstyrt å ringe Slipp ().

Se hva som skjer hvis du i stedet tildele den til en referanse, en ID2D1HwndRenderTarget * &.

Selvfølgelig, hvis du tilordner en referanse, vil du ikke være i stand til igjen.

Svarte 05/04/2009 kl. 14:34
kilden bruker

stemmer
0

Som det viser seg, klarte jeg å stoppe krasj ved å allokere prend med malloc. Dette er ikke et problem fordi jeg vil ringe gratis når jeg ikke trenger det lenger. Jeg er interessert i hvorfor kalle malloc fikser dette selv. Jeg er vant til å bare gjøre Datatype * var;, og så bare bruke var. Er det dårlig?

Svarte 05/04/2009 kl. 14:31
kilden bruker

stemmer
0

Det er uklart hvor mye kode eksisterer mellom når du tilordner den inn i struct og senere bruke det i CreateSolidColorBrush. Hvis det er en ikke-triviell mengde tid, er det mulig at du har en referanse telling problemet.

Skal du lagre en rå pekeren i struct? I så fall bytte til en CComPtr og se om ulykken går unna.

For eksempel. Hvis du hadde følgende type definisjon for verdien av prend (kaller det Render) og verdien prend ble ødelagt før den CreateSolidColorBrush samtalen, kan du se denne atferden.

struct Render { 
  ID2D1HwndRenderTarget *pCt;
  ~Render() {
    pCt->Release();
  }
};
Svarte 05/04/2009 kl. 14:11
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more