2013-03-30 29 views
0

我正在瀏覽一個包含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

在此先感謝。

+0

您所描述的一切都是完全正常的。 MIDL選擇IDL文件中第一個接口的IID作爲代理/存根的CLSID。所以你可能在頂部添加了新的界面。不是一個問題,它顯然得到了適當的重新註冊。必須重新啓動資源管理器也很正常。 –

+0

有沒有什麼辦法可以抵制MIDL挑選我已添加的新IID,並使其選取它最初選擇的IID,以便我不必重新啓動explorer.exe? –

+0

我已經提到過。不要把新界面放在最上面。 –

回答

0

ProxyStubClsid32中的內容實際上是用於MIDL編組的接口。它的使用是因爲你的接口繼承自IDispatch,並且需要編譯器負責編組(因爲它是一個OOP服務器,你需要編組)。

對於我們的團隊,我們在某些機器上註冊服務器時出現了一些問題(/ RegServer是不夠的),但是使用這個代碼的小exe修復了所有註冊問題(因此可能存在E_NOINTERFACE問題) ,只需在每次構建或安裝後調用它即可:

// Register the server 
      String^ l_TLB = l_Path + "\\MyServer.tlb"; 
      IntPtr l_TLBP = System::Runtime::InteropServices::Marshal::StringToBSTR(l_TLB); 
      ITypeLib *pTypeLib; 
      HRESULT hr; 
      hr = LoadTypeLibEx(static_cast<LPCOLESTR>(l_TLBP.ToPointer()), REGKIND_REGISTER, &pTypeLib); 
      if(SUCCEEDED(hr)) 
       pTypeLib->Release(); 
相關問題