2009-10-22 130 views
7

我想攔截COM CoCreateInstanceEx和/或CoGetClassObject函數,用單元測試中的測試墊片代替一個類。這將只針對單個CLSID;所有其他人都可以不變。有沒有辦法做到這一點,沒有可怕的,邪惡的黑客?有沒有辦法鉤住或攔截CoGetClassObject和/或CoCreateInstance調用?

+1

Dupe:http://stackoverflow.com/questions/1505196/spying-on-com-objects – 2009-10-22 09:33:41

+0

@Shay,的確如此。我已經投票認爲它是作爲一個愚蠢的關閉,但顯然僅僅是提問者投票結束還不夠(我不想刪除,因爲它可能有助於未來搜索的人) – bdonlan 2009-10-22 20:33:14

+0

不是重複的。這個問題是間諜COM對象。這個問題是針對單元測試的。前者嘗試通過掛鉤CoCreateInstance來解決問題 - 這並不意味着它必須是答案。這個問題想要掛鉤CoCreateInstance。 – 2009-11-10 22:26:01

回答

2

這取決於你究竟想要什麼。

如果要檢測是誰加載了該類,或者要查找是否加載了該類,則可以使用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 - >庫映射。

+0

不幸的是,我不能在這裏爲註冊表搞砸 - 它會運行在一個自動化的測試套件上,而我打算覆蓋的類是'CLSID_KnownFolderManager',所以在其中覆蓋它可能是一個壞主意系統範圍的方式:)在最糟糕的情況下,我可以測試要測試的代碼,但是如果有一種乾淨的方法來替換它僅僅是一個進程,那很好。 – bdonlan 2009-10-22 05:38:02

+1

首先,您可以在測試套件運行後註冊原始庫,這將恢復完整性。其次,您可以僅爲當前用戶註冊修改後的庫 - 修改HKCU \ Software \ Classes \ CLSID。除此之外,你不能做任何或多或少優雅的事情。 – sharptooth 2009-10-22 05:57:31

3

總是有CoTreatAsClass功能: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx

但是,正如你提到的,這將是一個全系統的更換之類的,而不是局部的變化。

或者,您可以像Shay Erlichmen的評論引用的帖子中所建議的那樣查看掛鉤CoCreateInstance。

相關問題