ばかげているように見えるかもしれませんが、これは実際に機能する InstallScript ソリューションです。
nvBufferSize = MAX_STRING;
nResult = MsiGetProperty( ISMSI_HANDLE, szPropertyName, svValue, nvBufferSize );
if( nResult = ERROR_MORE_DATA ) then
MsiGetProperty( ISMSI_HANDLE, szPropertyName, svValue, nvBufferSize );
endif;
最初の試行では、実際に必要なバッファー サイズが返されます。最大文字列 (1024?) を超える場合、2 番目の呼び出しですべてが取得されます。
あるいは、nvBufferSize をすぐに大きな値 (4096 など) に割り当てて、それを 1 回の呼び出しで使用できることがわかりました (データがその制限ではなくなったと仮定します)。ただし、ダブルコールはより確実です。
https://msdn.microsoft.com/en-us/library/aa370134(v=vs.85).aspxによると、API 関数は実際には、代わりに空のリテラル ("") を渡すことによってバッファサイズを返すように設計されています。文字列変数。ただし、InstallScript 2013 はコンパイル エラーをスローします。