在InstallShield中获取/设置全局变量

时间:2011-09-29 00:31:25

标签: installshield

我有执行特定任务的InstallScript代码。任务将起作用或不起作用。如果任务有效,我想将全局变量设置为1.如果它不起作用,我想将全局变量设置为0。

在某个地方,我有另一个执行的InstallScript代码。我想要的是检查全局变量以查看它是否为1.如果是,则触发该代码。

我知道我可以修改Install Exec Condition,但我不知道怎么做是检查全局变量。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:2)

在InstallScript项目中,只需创建并设置一个全局变量,并根据需要对其进行编码。

如果您要在MSI的上下文中询问运行InstallScript的自定义操作,则必须使用MSI Properties作为全局变量。调用MsiSetProperty进行设置,并针对该属性编写自定义操作的条件。或者调用MsiGetProperty在代码中检索它并在那里执行条件执行。请注意,如果第一个操作在UI序列中而第二个操作在执行序列中,则应将您使用的任何属性添加到SecureCustomProperties属性。

为了使其更具体,您的代码可能如下所示:

// Note: hInstall is the first parameter to your custom action
MsiSetProperty(hInstall, "RUN_SECOND_ACTION", "1"); 

并且您在自定义操作中的条件可能只是:

RUN_SECOND_ACTION

答案 1 :(得分:0)

你可以在.rul文件中声明函数之外的变量,变量将是一个全局变量。

如果要在另一个.rul文件中使用全局变量,则必须包含声明全局变量的rul文件。

离。

/* featureevents.rul */
STRING globalVar; // declare a global variable
export prototype xxx_installed();
function xxx_installed()
  STRING localVar; // declare a local variable
begin
end;

-

/* Setup.rul */
#include "featureevents.rul"
function OnFirstUIBefore()
begin
// use a global variable
  globalVar="This is a global variable.";
  MessageBox(globalVar, INFORMATION);
end;

我建议你添加一个或多个资源头文件,并将所有常量,全局变量和函数声明放在其中。

/* featureevents.rul */
#include "CusRes.h"
...

-

/* Setup.rul */
#include "CusRes.h"
...

-

/* CusRes.h */
#ifndef _CUSRES_H_
#define _CUSRES_H_

// move the code to resource header file
STRING globalVar;
export prototype xxx_installed();

#endif //_CUSRES_H_

然而,正如Urman所说,使用财产是一种更好的方式。

我错过了SecureCustomProperties的步骤,因此我无法通过MsiGetProperty()获取值并使用全局变量。

但是现在我已经获得了这些信息,而且我还会重写我的代码以使用属性。