atlに見る魔術

21
ATL に見る魔術 H.24/09/15 Egtra 2 回闇鍋プログラミング勉強会発表資料

Upload: egtra

Post on 21-May-2015

2.354 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: ATLに見る魔術

ATLに見る魔術

H.24/09/15

Egtra 第2回闇鍋プログラミング勉強会発表資料

Page 2: ATLに見る魔術

ATL

•Active Template Library

–Visual C++ 付属

–COMまわりの面倒を見てくれる

–テンプレートが沢山

Page 3: ATLに見る魔術

COM

• IUnknown

–QueryInterface

–AddRef

–Release

•参照カウント・キャスト

Page 4: ATLに見る魔術

モジュール

•DLLやEXE(プロセス)も参照カウントで管理

Page 5: ATLに見る魔術

典型的な実装

class Hoge

: public IUnknown {

Hoge() { Module Lock; }

AddRef() { ++count; }

Page 6: ATLに見る魔術

典型的な実装 (2)

Release() {

auto old = --count;

if (old == 0) {

Module Unlock;

delete this;

Page 7: ATLに見る魔術

ATLの基本

class Hoge

: public CComObjectRoot

, ……(その他インタフェース)

{

// 実装

};

Page 8: ATLに見る魔術

ATLの基本 (2)

•Hogeクラスではなく、 CComObjectでオブジェクトを作る

CComObject<Hoge>* obj;

CComObject<Hoge>

::CreateInstance(&obj);

Page 9: ATLに見る魔術

ATLの基本 (3)

class CComObjectRoot {

InternalAddRef() {}

InternalRelease() {}

long count;

};

Page 10: ATLに見る魔術

ATLの基本 (4)

template<class T>

class CComObject : T {

virtual ULONG AddRef() override {

return InternalAddRef();

}

// QueryInterface/Releaseも同様

};

Page 11: ATLに見る魔術

ATLの基本 (5)

•実装(Hoge)は多数のインタフェースから派生

•各インタフェースすべてIUnknownから派生

Page 12: ATLに見る魔術

ATLの基本 (6)

Hoge

• IStream

– ISequentialStream

•IUnknown

– IDispatch

•IUnknown

Page 13: ATLに見る魔術

ATLの基本 (7)

•継承のツリーにあるIUnknownすべてをoverrideするには

最派生クラスしかない

Page 14: ATLに見る魔術

ATLでの参照カウント実装

•CComObject

•CComObjectNoLock

•CComObjectGlobal

•CComObjectStack(Ex)

Page 15: ATLに見る魔術

CComObjectGlobal

•グローバル・静的変数用

AddRef() {

_Module.Lock();

}

Page 16: ATLに見る魔術

CComObjectStack

•自動変数(ローカル変数)

AddRef() {

// 何もしない!

}

Page 17: ATLに見る魔術

2つの顔を持つオブジェクト

•おさらい: IUnknown

–virtual QueryInterface();

–virtual AddRef();

–virtual Release();

Page 18: ATLに見る魔術

2つの顔を持つオブジェクト (2)

•_ICPLocator – virtual _LocCPQueryInterface();

– virtual AddRef();

– virtual Release();

Page 19: ATLに見る魔術

2つの顔を持つオブジェクト (3)

Hoge* hoge;

IUnknown* obj = hoge;

IUnknown* obj2 =

reinterpret_cast<IUnknown*>(

(_ICPLocator*)hoge);

Page 20: ATLに見る魔術

2つの顔を持つオブジェクト (4)

• obj: interfalce A, B, C

• obj2: interface D, E, F

• AddRef/Releaseは共有

Page 21: ATLに見る魔術

This work is licensed under a Creative Commons Attribution-ShareAlike 2.1 Japan License.