COM學習筆記2_COM接口vbtl內存佈局

COM實現vbtl內存佈局

 

 

這裏要注意的是,雖然圖中顯示IY的虛函數表中QueryInterface,AddRef和Release指向的
函數地址與IX的虛函數表中對應函數相同,都直接指向CA::QueryInterface等。
但其實並不完全是這樣。如果看彙編實現,可以看到
IY中的AddRef指向的地址是這樣:
[thunk]:CA::AddRef`adjustor{4}':
00401740  sub         ecx,4 
00401743  jmp         CA::AddRef (4015E0h) 
它會把ecx減4(ecx存放this指針),即將 IY::this 轉爲 CA::this,然後再調用 CA::AddRef
對於IX::AddRef就不需要這樣處理了

 

相關代碼:

  1. // 組件代碼  
  2. interface IX : IUnknown  
  3. {  
  4.     virtual void __stdcall Fx() = 0 ;  
  5. } ;  
  6. interface IY : IUnknown  
  7. {  
  8.     virtual void __stdcall Fy() = 0 ;  
  9. } ;  
  10. // Forward references for GUIDs  
  11. extern const IID IID_IX ;  
  12. extern const IID IID_IY ;  
  13. class CA : public IX,  
  14.            public IY  
  15. {  
  16.     virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;            
  17.     virtual ULONG __stdcall AddRef() { return 0 ;}  
  18.     virtual ULONG __stdcall Release() { return 0 ;}  
  19.     virtual void __stdcall Fx() { cout << "Fx" << endl ;}  
  20.     virtual void __stdcall Fy() { cout << "Fy" << endl ;}  
  21. } ;  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章