代码改变世界

InstallShield 2012新功能试用(2)- 调用MsiGetProperty等MSI API发生变化

2011-09-16 15:53  Kevin.Wan  阅读(4131)  评论(0编辑  收藏  举报

在InstallShield 2012的Basic MSI工程中,我们在Custom Action里通过InstallScript调用MSI的API时发生了变化。

 

比如下面这段代码,我们在InstallShield 2011里获取UpgradeCode:

function MsiGetProperty_2011(hMSI)   
STRING szPropertyName, svPropertyValue;
NUMBER nvBufferSize;
begin
szPropertyName = "UpgradeCode"; 
           
MsiGetProperty(hMSI, szPropertyName, svPropertyValue, nvBufferSize);
MessageBox(svPropertyValue, INFORMATION);

end;   

 

上面这段代码,如果我们放到InstallShield 2012中,svPropertyValue的值为空,正确调用方法如下:

function MsiGetProperty_2012(hMSI)   
STRING szPropertyName, svPropertyValue;
NUMBER nvBufferSize;
begin
szPropertyName = "UpgradeCode";  
nvBufferSize = 256;
           
MsiGetProperty(hMSI, szPropertyName, svPropertyValue, nvBufferSize);
MessageBox(svPropertyValue, INFORMATION);
end;

要指定一个合适的nvBufferSize值,如果按照以前方法调用不赋值,则默认为0,这样将导致我们无法获得正确的Property值。

详细见:http://support.installshield.com/kb/view.asp?articleid=Q211163 的“Changes in Behavior for Some MSI APIs That Are Called in InstallScript Custom Actions”一节。