2011-09-29 26 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。