如果注册表中存在特定密钥,则中止 Install Shield 安装
Abort the Install Shield installation if specific key exists in registry
在 setup.exe 安装期间,如果注册表中存在特定键,我想中止 installation.To 实现此目的,我在 install shield 项目中使用自定义操作调用安装脚本函数。
安装脚本代码是:
function MyFunction(hMSI)
// To Do: Declare local variables.
STRING szKey;
NUMBER nRootKey;
begin
// Set the root key to HKEY_LOCAL_MACHINE.
nRootKey = HKEY_LOCAL_MACHINE;
if (RegDBSetDefaultRoot (nRootKey) < 0) then
MessageBox ("First call to RegDBSetDefaultRoot failed.", SEVERE);
else
MessageBox ("Root key successfully set to HKEY_LOCAL_MACHINE.",
INFORMATION);
endif;
szKey = "SOFTWARE\Test";
if (RegDBKeyExist (szKey)< 0) then
MessageBox ("Test is not present", SEVERE);
abort;
endif;
if (RegDBKeyExist (szKey)= 1) then
MessageBox ("Test is present", SEVERE);
abort;
endif;
// To Do: Write script that will be executed when MyFunction is called.
end;
每次我收到消息 "Test is not present",即使注册表中存在密钥 "HKEY_LOCAL_MACHINE\SOFTWARE\Test"。
我想我在脚本中做错了什么或遗漏了什么。
请帮忙解决这个问题。
https://community.flexerasoftware.com/showthread.php?139026-Check-if-a-registry-key-exists
您的问题并未 100% 得到证实,但我认为很有可能:
- 您正在测试 Windows、
的 64 位安装
- 您正在使用 C:\Windows\System32\Regedt32.exe 或等效程序创建并直观地验证注册表项,并且
- 您不知道 InstallScript 引擎作为 32 位进程运行,或者不知道其中的含义。
如果这一切都是真的,问题是您已经创建了密钥 HKEY_LOCAL_MACHINE\SOFTWARE\Test,但是您的代码正在检查 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Test ,由于 registry redirector。要解决此问题,您应该执行以下操作之一:
- 在 32 位视图中测试一个键(例如,启动 C:\Windows\SysWow64\regedt32.exe);这将允许您使用名称 HKEY_LOCAL_MACHINE\SOFTWARE\Test 来表示重定向的位置。
- 通过在本地更改 REGDB_OPTIONS 以包含 REGDB_OPTION_WOW64_64KEY 来更改您的代码以请求注册表的 64 位视图。指定该标志时,不会重定向 InstallScript 注册表函数。不要忘记将 REGDB_OPTIONS 设置回其先前的值。
- 如果您的项目是基于 MSI 的,请考虑使用系统搜索并改为键入 19 "error" 自定义操作
请注意,如果此密钥是由您无法控制的软件创建的,您将需要确保检查的位置正确。这将影响第一个项目符号还是第二个项目符号是适合您的情况的更好选择。 (如果key完全在你的控制之下,你也应该想想它是否使用了正确的位置,如果不正确就改变它。)
在 setup.exe 安装期间,如果注册表中存在特定键,我想中止 installation.To 实现此目的,我在 install shield 项目中使用自定义操作调用安装脚本函数。 安装脚本代码是:
function MyFunction(hMSI)
// To Do: Declare local variables.
STRING szKey;
NUMBER nRootKey;
begin
// Set the root key to HKEY_LOCAL_MACHINE.
nRootKey = HKEY_LOCAL_MACHINE;
if (RegDBSetDefaultRoot (nRootKey) < 0) then
MessageBox ("First call to RegDBSetDefaultRoot failed.", SEVERE);
else
MessageBox ("Root key successfully set to HKEY_LOCAL_MACHINE.",
INFORMATION);
endif;
szKey = "SOFTWARE\Test";
if (RegDBKeyExist (szKey)< 0) then
MessageBox ("Test is not present", SEVERE);
abort;
endif;
if (RegDBKeyExist (szKey)= 1) then
MessageBox ("Test is present", SEVERE);
abort;
endif;
// To Do: Write script that will be executed when MyFunction is called.
end;
每次我收到消息 "Test is not present",即使注册表中存在密钥 "HKEY_LOCAL_MACHINE\SOFTWARE\Test"。
我想我在脚本中做错了什么或遗漏了什么。 请帮忙解决这个问题。
https://community.flexerasoftware.com/showthread.php?139026-Check-if-a-registry-key-exists
您的问题并未 100% 得到证实,但我认为很有可能:
- 您正在测试 Windows、 的 64 位安装
- 您正在使用 C:\Windows\System32\Regedt32.exe 或等效程序创建并直观地验证注册表项,并且
- 您不知道 InstallScript 引擎作为 32 位进程运行,或者不知道其中的含义。
如果这一切都是真的,问题是您已经创建了密钥 HKEY_LOCAL_MACHINE\SOFTWARE\Test,但是您的代码正在检查 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Test ,由于 registry redirector。要解决此问题,您应该执行以下操作之一:
- 在 32 位视图中测试一个键(例如,启动 C:\Windows\SysWow64\regedt32.exe);这将允许您使用名称 HKEY_LOCAL_MACHINE\SOFTWARE\Test 来表示重定向的位置。
- 通过在本地更改 REGDB_OPTIONS 以包含 REGDB_OPTION_WOW64_64KEY 来更改您的代码以请求注册表的 64 位视图。指定该标志时,不会重定向 InstallScript 注册表函数。不要忘记将 REGDB_OPTIONS 设置回其先前的值。
- 如果您的项目是基于 MSI 的,请考虑使用系统搜索并改为键入 19 "error" 自定义操作
请注意,如果此密钥是由您无法控制的软件创建的,您将需要确保检查的位置正确。这将影响第一个项目符号还是第二个项目符号是适合您的情况的更好选择。 (如果key完全在你的控制之下,你也应该想想它是否使用了正确的位置,如果不正确就改变它。)