U E D R , A S I H C RSS

COM/IUnknown

IUnknown Interface

COM ๊ฐ์ฒด์˜ ํ•ต์‹ฌ์„ ์ด๋ฃจ๋Š” ์ธํ„ฐํŽ˜์ด์Šค.
์ปด์ž์ฒด๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋ธ์ด ๊ฑฐ์˜ 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์ด ์ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์ฃผ์˜์ 

IUnknown ์€ ๊ตฌํ˜„์ฒด๊ฐ€ ์œ ํšจํ•œ ๊ธฐ๊ฐ„๋™์•ˆ ์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด ์•ˆ๋œ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ๋Š” QueryInterface(IID_IUnknown, (void**) &pIUnknownInterface) ๋ฅผ ํ†ตํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์˜ ์œ ํšจ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์ •์ƒ๊ทœํ˜„๋œ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด์„œ ๊ฐ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

----
COM
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:41
Processing time 0.0045 sec