我想攔截COM CoCreateInstanceEx和/或CoGetClassObject函數,用單元測試中的測試墊片代替一個類。這將只針對單個CLSID;所有其他人都可以不變。有沒有辦法做到這一點,沒有可怕的,邪惡的黑客?有沒有辦法鉤住或攔截CoGetClassObject和/或CoCreateInstance調用?
回答
這取決於你究竟想要什麼。
如果要檢測是誰加載了該類,或者要查找是否加載了該類,則可以使用Process Monitor。撥打CoGetClassObject()
(或CoCreateInstanceEx()
)將導致HKCR\CLSID\{Class of interest id}
密鑰被讀取,Process Monitor將向您顯示什麼程序和何時執行以及它的成功程度。
如果您想用您的庫替換現有的類,請使用您的具有相同類ID的類的版本編譯庫,並將路徑更改爲HKCR\CLSID\{Class of interest id}
以內的COM服務器,以便您的庫用於爲該類提供該類ID。您可以手動或使用regsvr32來做到這一點 - 首先註冊原始庫,然後您可以覆蓋感興趣的註冊類。當消費者呼叫CoGetClassObject()
或CoCreateInstanceEx()
時,COM通過該密鑰進行類id - >庫映射。
不幸的是,我不能在這裏爲註冊表搞砸 - 它會運行在一個自動化的測試套件上,而我打算覆蓋的類是'CLSID_KnownFolderManager',所以在其中覆蓋它可能是一個壞主意系統範圍的方式:)在最糟糕的情況下,我可以測試要測試的代碼,但是如果有一種乾淨的方法來替換它僅僅是一個進程,那很好。 – bdonlan 2009-10-22 05:38:02
首先,您可以在測試套件運行後註冊原始庫,這將恢復完整性。其次,您可以僅爲當前用戶註冊修改後的庫 - 修改HKCU \ Software \ Classes \ CLSID。除此之外,你不能做任何或多或少優雅的事情。 – sharptooth 2009-10-22 05:57:31
總是有CoTreatAsClass
功能: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx
但是,正如你提到的,這將是一個全系統的更換之類的,而不是局部的變化。
或者,您可以像Shay Erlichmen的評論引用的帖子中所建議的那樣查看掛鉤CoCreateInstance。
- 1. 有沒有辦法攔截C#中的setter和getters?
- 2. 有沒有辦法攔截所有的http,https流量
- 3. 有沒有辦法配置Fiddler攔截來自Windows服務的HTTP調用?
- 4. 攔截器沒有被調用retrofit2
- 5. 有沒有辦法在實例化後攔截Android Activity?
- 6. 有沒有辦法檢測Flash攔截器?
- 7. 用Javascript攔截或捕獲Ajax調用
- 8. 有沒有辦法掛鉤Java方法?
- 9. 有沒有辦法在Excel或PowerBI之外調用PowerQuery/M?
- 10. 有沒有辦法做或jQuery選擇
- 11. 抓住/攔截所有鼠標點擊
- 12. 有沒有辦法使用NamedParameterJdbcTemplate和GeneratedKeyHolder提取主鍵(或ROWID)?
- 13. 有沒有辦法檢查截斷表?
- 14. 有沒有辦法鉤住「控制器」發電機,所以它運行「rspec_controller」?
- 15. 在Grails/Groovy中攔截或重命名方法調用
- 16. Python攔截方法調用
- 17. .NET方法調用攔截
- 18. 有沒有辦法攔截關於圖書館元數據的查詢?
- 19. 有沒有什麼辦法可以在webview中攔截JavaScript觸發的URL?
- 20. 有沒有辦法在Spring攔截器中檢查HttpResponse是否是重定向?
- 21. 有沒有辦法攔截通過WCF端點發送的原始數據?
- 22. 有沒有辦法從Lotus Notes訪問MySQL和/或PHP頁面?
- 23. 攔截Groovy中所有元類的所有方法調用
- 24. 如何使用Spring攔截或過濾器攔截資源
- 25. 有沒有辦法抓住editText的日期和時間
- 26. 有沒有辦法調用「New」類?
- 27. 有沒有辦法禁用或修改Xcode的代碼完成?
- 28. 有沒有辦法暫時隱藏或禁用單向通知?
- 29. 有沒有辦法使用javascript或Jquery模糊圖像區域?
- 30. 有沒有辦法在Firefox或Chrome中禁用CSS3支持?
Dupe:http://stackoverflow.com/questions/1505196/spying-on-com-objects – 2009-10-22 09:33:41
@Shay,的確如此。我已經投票認爲它是作爲一個愚蠢的關閉,但顯然僅僅是提問者投票結束還不夠(我不想刪除,因爲它可能有助於未來搜索的人) – bdonlan 2009-10-22 20:33:14
不是重複的。這個問題是間諜COM對象。這個問題是針對單元測試的。前者嘗試通過掛鉤CoCreateInstance來解決問題 - 這並不意味着它必須是答案。這個問題想要掛鉤CoCreateInstance。 – 2009-11-10 22:26:01