2010-03-17 31 views
25

Windows 7正在緩存一些COM類信息。較早的操作系統沒有這樣做。操作系統查找HKCU\Software\Classes\CLSID\{GUID}\LocalServer32值後,會緩存該值,並且不會再查找它。如何防止Windows緩存Com類信息?

當我們更新我們的軟件時,我們將新的更新放置在不同的目錄中,然後更新HKCU\Software\Classes\CLSID\{GUID}\LocalServer32值以反映新路徑。軟件下次運行時,如果在較早的Windows操作系統下運行,它將使用最新的文件。但是,在Windows 7上,它將繼續使用舊文件,直到操作系統重新啓動。

我運行了進程監視器,發現在Windows 7下,它在第一次讀取後從未再次讀取註冊表項。在較舊的操作系統上,每次都會讀取該密鑰。

我的問題是:有沒有什麼辦法強制Windows 7重新讀取HKCU配置單元中的LocalServer32信息,每次創建一個新的proc COM對象時?

+3

我想你的COM服務器(.exe)在初始化時註冊一些類(CoRegisterClassObject)。你確定它爲所有已註冊的類調用CoRevokeClassObject,並在升級之前退出? – 2012-06-14 12:55:35

+0

從@SimonMourier繼續,舊的過程仍在運行還是退出?如果它仍在運行,那是你的問題。 – Ben 2012-06-20 09:26:47

+0

更新COM註冊後是否重新啓動了PC? – 2013-01-20 06:04:01

回答

1

由於這是Google針對此狹義問題的最佳結果,因此我認爲爲此問題添加我的故障排除結果將會很有價值。

我發現原來這響應:C# : How to change windows registry and take effect immediately

並連接解決方​​案從答案:Registry Watcher C#

這兩者似乎管理改變鍵而不強制重新啓動可行的選擇。對於我們(比如OP),這是在安裝更新時。對於我們來說(可能與OP不同),這種情況很少發生,我們決定實施和測試一個修復程序的工作量已經超過了需要重新啓動的簡單解決方案:一個Windows用戶在安裝軟件時所期待的過程。

2

我只能夠由...

1來解決這個問題:停止過程

2:使用REGSVR32庫明確地註銷(或者EXENAME/unregserver)

3:註冊新組件

4:啓動進程備份。

我會懷疑這是Un Reg部分對您來說不合格。如果您只是直接更改註冊表項,則應該調用RegSvr32/u。

當您調用RegSvr32時,還要確保新的目錄位置是當前目錄。

請注意,我一直停止該過程,然後未註冊,這可能是一個重要的細節。