ATLに見る魔術

  • 2,266 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,266
On Slideshare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
Downloads
4
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ATLに見る魔術H.24/09/15Egtra第2回闇鍋プログラミング勉強会発表資料
  • 2. ATL• Active Template Library –Visual C++ 付属 –COMまわりの面倒を見てく れる –テンプレートが沢山
  • 3. COM• IUnknown –QueryInterface –AddRef –Release• 参照カウント・キャスト
  • 4. モジュール• DLLやEXE(プロセス)も参 照カウントで管理
  • 5. 典型的な実装class Hoge : public IUnknown { Hoge() { Module Lock; } AddRef() { ++count; }
  • 6. 典型的な実装 (2)Release() { auto old = --count; if (old == 0) { Module Unlock; delete this;
  • 7. ATLの基本class Hoge : public CComObjectRoot , ……(その他インタフェース){ // 実装};
  • 8. ATLの基本 (2)• Hogeクラスではなく、 CComObjectでオブジェクト を作るCComObject<Hoge>* obj;CComObject<Hoge> ::CreateInstance(&obj);
  • 9. ATLの基本 (3)class CComObjectRoot { InternalAddRef() {} InternalRelease() {} long count;};
  • 10. ATLの基本 (4)template<class T>class CComObject : T { virtual ULONG AddRef() override { return InternalAddRef(); } // QueryInterface/Releaseも同様};
  • 11. ATLの基本 (5)• 実装(Hoge)は多数のインタ フェースから派生• 各インタフェースすべて IUnknownから派生
  • 12. ATLの基本 (6)Hoge• IStream – ISequentialStream •IUnknown – IDispatch •IUnknown
  • 13. ATLの基本 (7)• 継承のツリーにある IUnknownすべてをoverride するには 最派生クラスしかない
  • 14. ATLでの参照カウント実装• CComObject• CComObjectNoLock• CComObjectGlobal• CComObjectStack(Ex)
  • 15. CComObjectGlobal• グローバル・静的変数用AddRef() { _Module.Lock();}
  • 16. CComObjectStack• 自動変数(ローカル変数)AddRef() { // 何もしない!}
  • 17. 2つの顔を持つオブジェクト• おさらい: IUnknown –virtual QueryInterface(); –virtual AddRef(); –virtual Release();
  • 18. 2つの顔を持つオブジェクト (2)• _ICPLocator – virtual _LocCPQueryInterface(); – virtual AddRef(); – virtual Release();
  • 19. 2つの顔を持つオブジェクト (3)Hoge* hoge;IUnknown* obj = hoge;IUnknown* obj2 = reinterpret_cast<IUnknown*>( (_ICPLocator*)hoge);
  • 20. 2つの顔を持つオブジェクト (4)• obj: interfalce A, B, C• obj2: interface D, E, F• AddRef/Releaseは共有
  • 21. This work is licensed under a Creative Commons Attribution-ShareAlike 2.1 Japan License.