我是IntallShield的新手,并扩展了一个相当大的InstallScript项目,以便在首次安装时添加新的自定义注册表项(HKEY_LOCAL_MACHINE\SOFTWARE\Company\Product\Foo
)和有关功能的值。
根据项目的现有代码添加其他自定义注册表项和值,我添加了一个专用函数,在适当的情况下调用RegDBCreateKeyEx
和RegDBSetKeyValueEx
...
function BOOL RegisterFooFeature(szBar, szBaz)
string szValue;
number nType, nSize;
begin
RegDBSetDefaultRoot(gnProductRegRootKey); // gnProductRegRootKey = HKEY_LOCAL_MACHINE
//
// registry subkey
//
if (RegDBKeyExist(gszFooFeatureRegSubkey) < 0) then // gszFooFeatureRegSubkey = "SOFTWARE\\Company\\Product\\Foo"
if (RegDBCreateKeyEx(gszFooFeatureRegSubkey, gszProductRegClass) < 0) then
My_AddToLog("RegisterFooFeature: Unable to create registry key " + gszFooFeatureRegSubkey + ".");
return FALSE;
else
My_AddToLog("RegisterFooFeature: Created registry key " + gszFooFeatureRegSubkey + ".");
endif;
else
My_AddToLog("RegisterFooFeature: Found existing registry key " + gszFooFeatureRegSubkey + ".");
endif;
//
// registry values
//
nType = REGDB_STRING;
nSize = -1;
if (RegDBSetKeyValueEx(gszFooFeatureRegSubkey, gszBarRegValueName, nType, szBar, nSize) < 0) then
My_AddToLog("RegisterFooFeature: Unable to set registry value \"" + gszFooFeatureRegSubkey + "\\" + gszBarRegValueName + "\" to \"" + szBar + "\".");
return FALSE;
else
My_AddToLog("RegisterFooFeature: Set registry value \"" + gszFooFeatureRegSubkey + "\\" + gszBarRegValueName + "\" to \"" + szBar + "\".");
endif;
if (RegDBSetKeyValueEx(gszFooFeatureRegSubkey, gszBazRegValueName, nType, szBaz, nSize) < 0) then
My_AddToLog("RegisterFooFeature: Unable to set registry value \"" + gszFooFeatureRegSubkey + "\\" + gszBazRegValueName + "\" to \"" + szBaz + "\".");
return FALSE;
else
My_AddToLog("RegisterFooFeature: Set registry value \"" + gszFooFeatureRegSubkey + "\\" + gszBazRegValueName + "\" to \"" + szBaz + "\".");
endif;
return TRUE;
end;
...并在OnFirstUIBefore
中添加了对它的调用。
我通过记录确认OnFirstUIBefore
在第一次安装时执行,就像我期望的那样;并且我的日志记录表明创建了新的自定义注册表项(HKEY_LOCAL_MACHINE\SOFTWARE\Company\Product\Foo
)及其值;但我没有在注册表中看到新的自定义键及其值,就像我在首次安装后执行现有的自定义键和值一样。
我的新自定义注册表项在哪里?
答案 0 :(得分:0)
事实证明,在OnFirstUIBefore
调用RegisterFooFeature
之前,它调用了一个已删除REGDB_OPTION_WOW64_64KEY
的预先存在的函数...并且在它返回之前没有恢复它。
我在64位注册表配置单元中寻找新密钥及其值,但由于预先存在的函数的副作用,它们位于SOFTWARE\Wow6432Node
下的32位注册表配置单元中。 / p>