2011-09-29 27 views
1

我有执行特定任务的InstallScript代码。该任务可以工作或不工作。如果任务有效,我想将全局变量设置为1.如果它不起作用,我想将全局变量设置为0.在InstallShield中获取/设置全局变量

某处,我有另一个执行的InstallScript代码。我想要的是检查全局变量以查看它是否为1.如果是,请关闭该代码。

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

回答

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 
+0

谢谢。事实确实如此。我唯一需要做的就是在“自定义操作和序列”中,添加一个新的集合属性,我很高兴去。 – coson

0

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

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

ex。

/* 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()获取值,而是使用全局变量。

但是现在我已经获得了这些信息,并且我还将重写我的代码以使用property。