2009-10-26 33 views
1

我們的產品包含一個VC++ ATL in-proc COM服務器,帶有兩個COM公開類 - ClassA和ClassB。將此COM服務器添加到Install Shield 2008安裝程序包中,併爲該組件設置「在生成時提取COM」屬性。如何安裝屏蔽「在生成COM提取」工作?

ClassA和ClassB以組件的完全相同的方式公開 - 每個都有一個.rgs文件,兩個.rgs文件被編譯到組件資源中,併爲它們調用CAtlModule :: UpdateRegistryFromResourceS()。

但是,當我們在COM服務器上運行regsvr32時,這兩個類都正確地向註冊表公開,但是當我們運行該程序包的安裝時,只有其中一個被Install Shield公開。

Install Shield如何發現它要對註冊表進行哪些更改?我們應該檢查什麼來檢測問題的根源?

回答

2

我懷疑他們使用RegOverridePredefKey(至少MSDN暗示他們應該): http://msdn.microsoft.com/en-us/library/ms724901(VS.85).aspx

後目標鍵已經覆蓋到一些私人的位置,InstallShield可能解析註冊表結構和生成一個腳本吧。儘管我不知道InstallShield實際上做了什麼,但我想我會在運行InstallShield的構建時開始使用RegMon,以查看我是否可以辨別註冊的位置,然後嘗試發現它做錯了什麼。

1

如果您想要詳細解釋(或儘可能多地允許),您將要轉到InstallShield社區論壇並向InstallShield員工MichalU發佈問題。如果你想大致瞭解這些工作是如何工作的,你可以看看WiX的源代碼,因爲Heat有能力提取com信息。

如果構建時的COM解壓縮給您帶來麻煩,您可以關閉它並靜態插入COM數據。