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