我掛在windows COM對象上。
使用的方法是vtable修改。說我們有接口一個命名例如,它包含在接口oldmethod的一個實例,我換成newmethod。但是,在我的新方法我需要知道oldmethod的地址,以便我可以在做我自己的事情後調用oldmethod。
這是不安全的存儲地址在全局變量oldmethod,因爲有可能是背後接口一個不止一個實現,比方說有兩種實現方式,類A1和A2級。因此,我的新方法需要存儲兩個A1-> oldmethod和A2-> oldmethod,並根據實例類型調用適當的函數。做到這一點
一種方式就是,我不斷在地圖上,存儲(虛表的地址 - > oldmethod)。由於vtable的地址可以作爲A1類和A2類的區別。在我的新方法中,針對當前實例檢查地圖的正確方法oldmethod。但是,這會使程序每次都檢查地圖,這會增加成本,並且地圖上的線程安全性會增加成本。
的另一種方式是使封閉的,我分配可執行存儲器的塊,和寫我newmethod內的二進制碼(可以被減小到最小尺寸,所以大小是沒有問題的)。我修改了每個實例的二進制代碼oldmethod的地址。在這種情況下,不會搜索地圖成本。
問題1:
是第二種方式以安全的方式做到這一點,或者說是第一種方式更好?其中任何一個都有任何潛在的安全問題?
問題2:
在第二種方式中,我創建封閉包含類特定的數據,這是oldmethod指針。如果我需要將實例特定數據存儲在我的新方法中,除了保留(此指針 - >數據)映射之外是否還有其他策略?我盡力而爲,找不到方法。
有沒有你不某種特定原因只是從現有的實現派生的coclass,幾乎覆蓋了「oldmethod」與「newmethod」的簽名*必須*匹配或者你是根據定義,違反了COM的爲合同發佈IID和接口的引腳。當然,除非這不是你的代碼(舊的方法),並且你基本上試圖去鉤住別人的coclass。你也可以使用coclass別名,但這聽起來像你更喜歡這樣做的狡猾。 – WhozCraig 2013-02-17 09:26:24
我掛在現有的COM對象來修改它的行爲,我沒有實現。 – 2013-02-17 10:21:50
@WhozCraig我不直接調用方法,我也沒有調用者的代碼。 – 2013-02-17 10:25:33