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.0242 sec