<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=COM%2FIUnknown</id>
	<title>COM/IUnknown - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=COM%2FIUnknown"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=COM/IUnknown&amp;action=history"/>
	<updated>2026-05-14T13:45:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=COM/IUnknown&amp;diff=29696&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=COM/IUnknown&amp;diff=29696&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:41Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= IUnknown Interface =&lt;br /&gt;
COM 객체의 핵심을 이루는 인터페이스.&lt;br /&gt;
컴자체가 바이너리 모델이 거의 C++을 유사한 형태로 가져온 만큼 C++ 모습을 보면 대략 어떤 향태인지를 추측할 수 있다.&lt;br /&gt;
&lt;br /&gt;
 // c++ implementation&lt;br /&gt;
 class IUnknown&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 virtual HRESULT QueryInterface(REFIID riid, void** ppvObject) = 0;&lt;br /&gt;
 virtual ULONG AddRef() = 0;&lt;br /&gt;
 virtual ULONG Release() = 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // c implementation&lt;br /&gt;
 typedef struct IUnknown IUnknown&lt;br /&gt;
 &lt;br /&gt;
 typedef struct {&lt;br /&gt;
 HRESULT (*QueryInterface) (IUnknown *This, REFIID *This, REFIID riid, void** ppvObject);&lt;br /&gt;
 ULONG (*AddRef) (IUnknown *This);&lt;br /&gt;
 ULONG (*Release) (IUnknown *This);&lt;br /&gt;
 } IUnknownVtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct {&lt;br /&gt;
 struct IUnknownVtable * lpVtable;&lt;br /&gt;
 } IUnknown;&lt;br /&gt;
&lt;br /&gt;
= 각 메소드 역할 =&lt;br /&gt;
== QueryInterface ==&lt;br /&gt;
COM 객체를 다루는데 있어서 가장 핵심적인 인터페이스. REFIID 를 이용해 ID 에 맞는 인터페이스 포인터를 얻을 수 잇다.&lt;br /&gt;
&lt;br /&gt;
== AddRef, Release ==&lt;br /&gt;
COM 객체의 참조카운팅을 조절한다. &lt;br /&gt;
COM 객체를 다른 포인터에 할당하거나 NULL 로 초기화 할 때 호출하여 참조카운터를 올바르게 유지해야만 객체의 정상적인 소멸을 보장할 수 있다.&lt;br /&gt;
※ 이론적인 내용은 C++ 의 스마트 포인터 파트를 참조. 참조카운팅의 용도와 필요성에 대해서 숙지한다.&lt;br /&gt;
C++ 스마트 포인터에서는 참조 카운팅을 이용해서 dangling pointer 문제를 해결한다. boost 의 shared_ptr이 이를 구현한다.&lt;br /&gt;
&lt;br /&gt;
= 주의점 =&lt;br /&gt;
IUnknown 은 구현체가 유효한 기간동안 인터페이스 포인터를 변경시키면 안된다.&lt;br /&gt;
인터페이스 포인터는 &amp;#039;&amp;#039;&amp;#039;QueryInterface(IID_IUnknown, (void**) &amp;amp;pIUnknownInterface)&amp;#039;&amp;#039;&amp;#039; 를 통해서 얻을 수 있으며, 이의 유효를 검사하는 것이 가능하다.&lt;br /&gt;
정상규현된 컴포넌트라면 인터페이스 포인터를 비교하는 것을 통해서 각 객체가 같은 컴포넌트의 인스턴스인지 확인이 가능하다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[COM]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>