IUnknown Interface ¶
COM ๊ฐ์ฒด์ ํต์ฌ์ ์ด๋ฃจ๋ ์ธํฐํ์ด์ค.
์ปด์์ฒด๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋ธ์ด ๊ฑฐ์ C++์ ์ ์ฌํ ํํ๋ก ๊ฐ์ ธ์จ ๋งํผ C++ ๋ชจ์ต์ ๋ณด๋ฉด ๋๋ต ์ด๋ค ํฅํ์ธ์ง๋ฅผ ์ถ์ธกํ ์ ์๋ค.
์ปด์์ฒด๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋ธ์ด ๊ฑฐ์ C++์ ์ ์ฌํ ํํ๋ก ๊ฐ์ ธ์จ ๋งํผ C++ ๋ชจ์ต์ ๋ณด๋ฉด ๋๋ต ์ด๋ค ํฅํ์ธ์ง๋ฅผ ์ถ์ธกํ ์ ์๋ค.
~cpp // c++ implementation class IUnknown { public: virtual HRESULT QueryInterface(REFIID riid, void** ppvObject) = 0; virtual ULONG AddRef() = 0; virtual ULONG Release() = 0; } // c implementation typedef struct IUnknown IUnknown typedef struct { HRESULT (*QueryInterface) (IUnknown *This, REFIID *This, REFIID riid, void** ppvObject); ULONG (*AddRef) (IUnknown *This); ULONG (*Release) (IUnknown *This); } IUnknownVtable; typedef struct { struct IUnknownVtable * lpVtable; } IUnknown;
๊ฐ ๋ฉ์๋ ์ญํ ¶
QueryInterface ¶
COM ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋๋ฐ ์์ด์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ์ธํฐํ์ด์ค. REFIID ๋ฅผ ์ด์ฉํด ID ์ ๋ง๋ ์ธํฐํ์ด์ค ํฌ์ธํฐ๋ฅผ ์ป์ ์ ์๋ค.
AddRef, Release ¶
COM ๊ฐ์ฒด์ ์ฐธ์กฐ์นด์ดํ
์ ์กฐ์ ํ๋ค.
COM ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ํฌ์ธํฐ์ ํ ๋นํ๊ฑฐ๋ NULL ๋ก ์ด๊ธฐํ ํ ๋ ํธ์ถํ์ฌ ์ฐธ์กฐ์นด์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์งํด์ผ๋ง ๊ฐ์ฒด์ ์ ์์ ์ธ ์๋ฉธ์ ๋ณด์ฅํ ์ ์๋ค.
โป ์ด๋ก ์ ์ธ ๋ด์ฉ์ C++ ์ ์ค๋งํธ ํฌ์ธํฐ ํํธ๋ฅผ ์ฐธ์กฐ. ์ฐธ์กฐ์นด์ดํ ์ ์ฉ๋์ ํ์์ฑ์ ๋ํด์ ์์งํ๋ค.
C++ ์ค๋งํธ ํฌ์ธํฐ์์๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ด์ฉํด์ dangling pointer ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. boost ์ shared_ptr์ด ์ด๋ฅผ ๊ตฌํํ๋ค.
COM ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ํฌ์ธํฐ์ ํ ๋นํ๊ฑฐ๋ NULL ๋ก ์ด๊ธฐํ ํ ๋ ํธ์ถํ์ฌ ์ฐธ์กฐ์นด์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์งํด์ผ๋ง ๊ฐ์ฒด์ ์ ์์ ์ธ ์๋ฉธ์ ๋ณด์ฅํ ์ ์๋ค.
โป ์ด๋ก ์ ์ธ ๋ด์ฉ์ C++ ์ ์ค๋งํธ ํฌ์ธํฐ ํํธ๋ฅผ ์ฐธ์กฐ. ์ฐธ์กฐ์นด์ดํ ์ ์ฉ๋์ ํ์์ฑ์ ๋ํด์ ์์งํ๋ค.
C++ ์ค๋งํธ ํฌ์ธํฐ์์๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ด์ฉํด์ dangling pointer ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. boost ์ shared_ptr์ด ์ด๋ฅผ ๊ตฌํํ๋ค.
์ฃผ์์ ¶
IUnknown ์ ๊ตฌํ์ฒด๊ฐ ์ ํจํ ๊ธฐ๊ฐ๋์ ์ธํฐํ์ด์ค ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝ์ํค๋ฉด ์๋๋ค.
์ธํฐํ์ด์ค ํฌ์ธํฐ๋ QueryInterface(IID_IUnknown, (void**) &pIUnknownInterface) ๋ฅผ ํตํด์ ์ป์ ์ ์์ผ๋ฉฐ, ์ด์ ์ ํจ๋ฅผ ๊ฒ์ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ ์๊ทํ๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ์ธํฐํ์ด์ค ํฌ์ธํฐ๋ฅผ ๋น๊ตํ๋ ๊ฒ์ ํตํด์ ๊ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค์ธ์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
----
COM
์ธํฐํ์ด์ค ํฌ์ธํฐ๋ QueryInterface(IID_IUnknown, (void**) &pIUnknownInterface) ๋ฅผ ํตํด์ ์ป์ ์ ์์ผ๋ฉฐ, ์ด์ ์ ํจ๋ฅผ ๊ฒ์ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ ์๊ทํ๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ์ธํฐํ์ด์ค ํฌ์ธํฐ๋ฅผ ๋น๊ตํ๋ ๊ฒ์ ํตํด์ ๊ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค์ธ์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
COM