我有执行特定任务的InstallScript代码。任务将起作用或不起作用。如果任务有效,我想将全局变量设置为1.如果它不起作用,我想将全局变量设置为0。
在某个地方,我有另一个执行的InstallScript代码。我想要的是检查全局变量以查看它是否为1.如果是,则触发该代码。
我知道我可以修改Install Exec Condition,但我不知道怎么做是检查全局变量。我怎么能做到这一点?
答案 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()获取值并使用全局变量。
但是现在我已经获得了这些信息,而且我还会重写我的代码以使用属性。