1

MsiGetProperty を使用して、インストーラーから文字列パラメーター値を取得しています。その後、マネージド dll を呼び出して、その値を渡します。

  nvBufferSize = MAX_STRING;
  MsiGetProperty (hMSI, "DBHMS", sDbHost, nvBufferSize);  

sDbHost の値を渡すと、マネージ コードから受け取ると次のようになります。

その同じコードで、Installshield 2010 では問題ありませんでしたが、今はそれを installshield 2012 にアップグレードしています。解決策はありますか?

4

2 に答える 2

0

ばかげているように見えるかもしれませんが、これは実際に機能する 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 はコンパイル エラーをスローします。

于 2015-08-25T22:04:25.607 に答える