我有执行特定任务的InstallScript代码。该任务可以工作或不工作。如果任务有效,我想将全局变量设置为1.如果它不起作用,我想将全局变量设置为0.在InstallShield中获取/设置全局变量
某处,我有另一个执行的InstallScript代码。我想要的是检查全局变量以查看它是否为1.如果是,请关闭该代码。
我知道我可以修改Install Exec Condition,但是我不知道该怎么做的是检查一个全局变量。我怎么能做到这一点?
我有执行特定任务的InstallScript代码。该任务可以工作或不工作。如果任务有效,我想将全局变量设置为1.如果它不起作用,我想将全局变量设置为0.在InstallShield中获取/设置全局变量
某处,我有另一个执行的InstallScript代码。我想要的是检查全局变量以查看它是否为1.如果是,请关闭该代码。
我知道我可以修改Install Exec Condition,但是我不知道该怎么做的是检查一个全局变量。我怎么能做到这一点?
在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
你可以只声明该函数外的变量在.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。
谢谢。事实确实如此。我唯一需要做的就是在“自定义操作和序列”中,添加一个新的集合属性,我很高兴去。 – coson