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