我正在瀏覽一個包含COM服務器(在ATL中實現的COM類)的EXE代碼。 它有一個定義了所有接口的.idl文件。 現在COM服務器註冊後,我通過註冊表項,我可以找到以下內容。 每個接口都有一個帶有IID和ProxyStubClsid32的條目。 有一個接口是由我提到的COM服務器實現的,它在關鍵字段中具有IID = ProxyStubClsid32的值,並且每個其他接口接口條目在其ProxyStubClsid32字段中具有相同的IID條目。 爲什麼這樣呢?添加一個新的接口和組件到COM服務器之外的註冊表項中的更改
接下來,當我嘗試添加一個新的接口和新的COM組件實現這個接口的EXE,並做它的註冊我可以在註冊表中看到現在IID條目這個新接口和它的ProxyStubClsid32是相同的。 現在,新添加的IID出現在所有其他接口的ProxyStubClsid32中。
什麼進入ProxyStubClsid32,這是如何決定的?
即使在添加我的新界面之後,我希望以前的IID出現在ProxyStubClsid32中。我怎樣才能做到這一點 ??
另外explorer.exe緩存此註冊表項,因爲我正在實現一個加載組件的外殼擴展,我認爲它指的是舊條目,所以查詢該exe新界面不工作。一旦我重新啓動explorer.exe一切正常。
任何人都可以對此發表評論。
答案,這似乎有一定的提示,我的問題:Registry keys for out-of-process COM server
在此先感謝。
您所描述的一切都是完全正常的。 MIDL選擇IDL文件中第一個接口的IID作爲代理/存根的CLSID。所以你可能在頂部添加了新的界面。不是一個問題,它顯然得到了適當的重新註冊。必須重新啓動資源管理器也很正常。 –
有沒有什麼辦法可以抵制MIDL挑選我已添加的新IID,並使其選取它最初選擇的IID,以便我不必重新啓動explorer.exe? –
我已經提到過。不要把新界面放在最上面。 –