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