次の方法で共有


MsiRecordReadStream 関数 (msiquery.h)

MsiRecordReadStream 関数は、レコード ストリーム フィールドからバッファーにバイトを読み取ります。

構文

UINT MsiRecordReadStream(
  [in]      MSIHANDLE hRecord,
  [in]      UINT      iField,
  [out]     char      *szDataBuf,
  [in, out] LPDWORD   pcbDataBuf
);

パラメーター

[in] hRecord

レコードへのハンドル。

[in] iField

レコードのフィールドを指定します。

[out] szDataBuf

ストリーム フィールドを受信するバッファー。 宛先バッファーのサイズがソース バッファーと同じか大きいことを確認する必要があります。 「解説」を参照してください。

[in, out] pcbDataBuf

in バッファーと out バッファーの数を指定します。 入力時に、これはバッファーのフル サイズです。 出力では、これは実際にバッファーに書き込まれたバイト数です。 「解説」を参照してください。

戻り値

この関数は UINT を返します。

解説

ストリームを読み取る場合は、関数が呼び出されるたびにストリームからバッファーに転送されるバイト数に pcbDataBuf を設定します。 返されると、 MsiRecordReadStreampcbDataBuf を実際に転送されたバイト数にリセットします。 バッファーがストリームよりも小さい場合、バッファーがいっぱいになるとストリームの位置が変更され、ストリーム内の次のデータが関数の次の呼び出しによって転送されます。 これ以上バイトを使用できない場合、 MsiRecordReadStream はERROR_SUCCESSを返します。

szDataBuf に 0 を渡すと、pcbDataBuf は読み取るストリーム内の残りのバイト数にリセットされます。

次のコード サンプルは、hRecord で指定されたレコードのフィールド 1 にあるストリームから読み取り、ストリーム全体を一度に 8 バイト読み取ります。

char szBuffer[8];
PMSIHANDLE hRecord;
DWORD cbBuf = sizeof(szBuffer);
do 
{
    if (MsiRecordReadStream(hRecord, 1, szBuffer, 
        &cbBuf) != ERROR_SUCCESS)
        break; /* error */
}
while (cbBuf == 8);  //continue reading the stream while you receive a full buffer
//cbBuf will be less once you reach the end of the stream and cannot fill your 
//buffer with stream data

ストリームに対する OLE の制限事項」も参照してください。

要件

   
サポートされている最小のクライアント Windows Server 2012、Windows 8、Windows Server 2008 R2、または Windows 7 の Windows インストーラー 5.0。 Windows Server 2008 または Windows Vista の Windows インストーラー 4.0 または Windows インストーラー 4.5。 Windows Server 2003 または Windows XP の Windows インストーラー
対象プラットフォーム Windows
ヘッダー msiquery.h
Library Msi.lib
[DLL] Msi.dll

関連項目

レコード処理関数