views:

197

answers:

2

Our product contains a VC++ ATL in-proc COM server with two COM-exposed classes - ClassA and ClassB. This COM server is added into an Install Shield 2008 installer package and "COM Extract at Build" property is set for the component.

ClassA and ClassB are exposed in exactly identical manner by the component - there's an .rgs file for each, both .rgs files are compiled into the component resources and CAtlModule::UpdateRegistryFromResourceS() is invoked for both of them.

However when we run regsvr32 on the COM server both classes are exposed to the registry correctly but when we run installation of the package only one of them is exposed by Install Shield.

How does Install Shield discover which changes to the registry it is to make? What should we check to detect the source of the problem?

+2  A: 

I suspect they use RegOverridePredefKey (at least MSDN hints they should): http://msdn.microsoft.com/en-us/library/ms724901%28VS.85%29.aspx

After the target keys have been overridden to some private location, InstallShield can parse the registry structure and generate a script for it.

This is all conjecture, though, I don't know what InstallShield actually does, but I think I'd start with RegMon while InstallShield's build runs, to see if I could discern where the registrations go, and then try to spot what it does wrong.

Kim Gräsman
+1  A: 

If you want a detailed explanation ( or as much as he's allowed to give ) your going to want to go over to the InstallShield Community forum and post a question for InstallShield employee MichalU. If you want to know in general how these things work you can look at the source code to WiX as Heat has the ability to extract com information.

If the COM extract at build gives you trouble you can turn it off and insert the COM data statically.

Christopher Painter