ATLに見る魔術

2,778 views
2,669 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,778
On SlideShare
0
From Embeds
0
Number of Embeds
1,547
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

ATLに見る魔術

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

×