cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
svend_lysemose
Level 3

MsiGetProperty

nLEN must now be assigned before calling MsiGetProperty in InstallScript
Labels (1)
0 Kudos

(8) Replies
DebbieL
Level 17

Thanks for pointing that out. This change in behavior is now explained in KB article Q211163 (Upgrading Projects to InstallShield 2012). See the "Changes in Behavior for Some MSI APIs That Are Called in InstallScript Custom Actions" section of this article for more background.
0 Kudos
svend_lysemose
Level 3

When I try to open Q211163 I get a blank page (I am succesfully logged in to the support portal).
0 Kudos
DebbieL
Level 17

Hmm. That's weird. You should be able to see that KB article regardless of whether you are logged in. The URL that I provided above is a redirect URL. It seems to be working now, but maybe it wasn't redirecting for some reason when you tried it, or maybe your browser is blocking the redirect somehow.

Try this direct link:
http://kb.flexerasoftware.com/selfservice/microsites/search.do?cmd=displayKC&docType=kc&externalId=Q211163
0 Kudos
svend_lysemose
Level 3

I have tried again from two different machines and can still not access Q211163. I am running Internet Explorer 9.0 and have no idea what could be causing the problem.
0 Kudos
DebbieL
Level 17

Hmm. I'm not sure what's going on. I'll have someone look into it. In the meantime, here's the applicable content from the KB article:

Changes in Behavior for Some MSI APIs That Are Called in InstallScript Custom Actions
A change was made to how the InstallScript engine calls Windows Installer API such as MsiGetProperty. The engine now calls the Windows Installer APIs directly instead of using wrapper APIs that in turn call the Windows Installer APIs. This change was made to resolve issues with buffer handling and buffer sizes. It applies to all new projects that you create in InstallShield 2012, as well as projects that you have upgraded from earlier versions of InstallShield to InstallShield 2012.

As a result of this change, you can use the MSI install handle that is passed to a custom action function with all Windows Installer APIs that require an install handle. Previously, the handle was managed by the InstallScript engine, and it could not be passed directly to Windows Installer APIs.

Also as a result of this change, any Windows Installer APIs that require a buffer size to be specified now fail if the buffer size is not correctly specified. Note that 0 is not a valid size; thus, ensure that your code does not pass a zero value for the size of the buffer.

If you have existing InstallScript custom actions that call Windows Installer APIs, ensure that a large enough buffer size is specified; if it is not, unexpected results could occur.

The following sample code demonstrates how to retrieve the value of a Windows Installer property value string in InstallScript and increase the size of the buffer if necessary.
prototype STRING MyGetProperty (HWND, STRING);
////////////////////////////////////////////////////////////////////////////////////////////
// MyGetProperty
// Return an MSI property string value
// Input Parameters:
// hMSIHandle: Handle to the currently running MSI database
// szPropertyName: Name of property to retrieve
// Output:
// String containing the property value
///////////////////////////////////////////////////////////////////////////////////////////

function STRING MyGetProperty (hMSIHandle, szPropertyName)
NUMBER nvBuf, nResult;
STRING szReturn;
begin

//Retrieve the size of the property value szReturn = "";
nResult = MsiGetProperty (hMSIHandle, szPropertyName, szReturn, nvBuf);

if (ERROR_MORE_DATA == nResult) then
nvBuf = nvBuf + 1; //increment buffer size for terminating null

//Retrieve the property value
nResult = MsiGetProperty (hMSIHandle, szPropertyName, szReturn, nvBuf);

if (nResult != ERROR_SUCCESS) then
szReturn = "";
endif;
endif;
return szReturn;
end;


Note that if the script had used if ( ERROR_MORE_DATA == nResult ) then instead of if ( ERROR_MORE_DATA == nResult ) then, unexpected results could occur.
0 Kudos
DebbieL
Level 17

It sounds like if you want to view the KB articles in IE 9, you'll need to have compatibility mode turned on.

Both Chrome and Firefox can display KB articles, so they may be other options to consider.
0 Kudos
Christopher_Pai
Level 16

Can someone at InstallShield explain the rational for why this change was made? While I understand how the MSI API works in a C/C++ world, InstallScript is supposed to be a higher level language and we've always ( 13 years? ) been able to make this API calls without having to do silly things like set nBufferSize since InstallScript doesn't require you to size string buffers in the first place. ( Well, atleast not since InstallShield 3 as I recall... )

Short of a really good explanation, I would describe this change as a bug not an improvement.
0 Kudos
MichaelU
Level 12 Flexeran
Level 12 Flexeran

It's both. Previously you didn't really have to set nBufferSize because we ignored it and used a relatively high value. However this means when you legitimately had a really long property value, it couldn't be read. The "fix" for the latter part broke the first part. Personally I think there's a better middle ground to be found, perhaps use the larger of the previous value and the passed value.
0 Kudos