Win32 API 日本語リファレンス
ホームSystem.ApplicationInstallationAndServicing › MsiGetSummaryInformationW

MsiGetSummaryInformationW

関数
データベースのサマリ情報ストリームを開いてハンドルを取得する。
DLLmsi.dll文字セットUnicode (-W)呼出規約winapi対応OSwindows8.0

シグネチャ

// msi.dll  (Unicode / -W)
#include <windows.h>

DWORD MsiGetSummaryInformationW(
    MSIHANDLE hDatabase,
    LPCWSTR szDatabasePath,
    DWORD uiUpdateCount,
    MSIHANDLE* phSummaryInfo
);

パラメーター

名前方向説明
hDatabaseMSIHANDLEinデータベースへのハンドル。
szDatabasePathLPCWSTRinデータベースへのパスを指定します。
uiUpdateCountDWORDin更新される値の最大数を指定します。
phSummaryInfoMSIHANDLE*inout概要情報ハンドルを受け取る場所へのポインター。

戻り値の型: DWORD

公式ドキュメント

MsiGetSummaryInformation 関数は、インストーラー データベースの _SummaryInformation ストリームへのハンドルを取得します。この関数が返すハンドルは、MsiCloseHandle を使用して閉じる必要があります。(Unicode)

戻り値

MsiGetSummaryInformation 関数は、次の値を返します。

解説(Remarks)

MsiGetSummaryInformation 関数で指定するデータベースが開かれていない場合は、hDatabase に 0 を指定し、szDatabasePath にデータベースへのパスを指定する必要があります。データベースが開かれている場合は、szDatabasePath を 0 に設定する必要があります。

既存の概要情報ストリームを開くために 0 より大きい uiUpdateCount の値を使用した場合は、phSummaryInfo ハンドルを閉じる前に MsiSummaryInfoPersist を呼び出す必要があります。これを行わないと、既存のストリーム情報が失われます。

MsiGetSummaryInformation を使用してパッチの概要情報を表示するには、szDatabasePath にパッチへのパスを設定します。あるいは、 MsiOpenDatabase を使用してパッチへのハンドルを作成し、そのハンドルを hDatabase パラメーターとして MsiGetSummaryInformation に渡すこともできます。

インストーラーは PMSIHANDLE オブジェクトがスコープ外になると自動的に閉じるのに対し、MSIHANDLE オブジェクトは MsiCloseHandle を呼び出して閉じる必要があるため、PMSIHANDLE 型の変数を使用することが推奨されます。詳細については、Windows インストーラーのベスト プラクティスHANDLE の代わりに PMSIHANDLE を使用するセクションを参照してください。

関数が失敗した場合は、MsiGetLastErrorRecord を使用して拡張エラー情報を取得できます。

メモ

msiquery.h ヘッダーは、MsiGetSummaryInformation を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義しています。エンコーディング中立のエイリアスの使用を、エンコーディング中立ではないコードと混在させると、不一致が発生し、コンパイル エラーまたは実行時エラーを引き起こす可能性があります。詳細については、関数プロトタイプの規則を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// msi.dll  (Unicode / -W)
#include <windows.h>

DWORD MsiGetSummaryInformationW(
    MSIHANDLE hDatabase,
    LPCWSTR szDatabasePath,
    DWORD uiUpdateCount,
    MSIHANDLE* phSummaryInfo
);
[DllImport("msi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern uint MsiGetSummaryInformationW(
    uint hDatabase,   // MSIHANDLE
    [MarshalAs(UnmanagedType.LPWStr)] string szDatabasePath,   // LPCWSTR
    uint uiUpdateCount,   // DWORD
    ref uint phSummaryInfo   // MSIHANDLE* in/out
);
<DllImport("msi.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function MsiGetSummaryInformationW(
    hDatabase As UInteger,   ' MSIHANDLE
    <MarshalAs(UnmanagedType.LPWStr)> szDatabasePath As String,   ' LPCWSTR
    uiUpdateCount As UInteger,   ' DWORD
    ByRef phSummaryInfo As UInteger   ' MSIHANDLE* in/out
) As UInteger
End Function
' hDatabase : MSIHANDLE
' szDatabasePath : LPCWSTR
' uiUpdateCount : DWORD
' phSummaryInfo : MSIHANDLE* in/out
Declare PtrSafe Function MsiGetSummaryInformationW Lib "msi" ( _
    ByVal hDatabase As Long, _
    ByVal szDatabasePath As LongPtr, _
    ByVal uiUpdateCount As Long, _
    ByRef phSummaryInfo As Long) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MsiGetSummaryInformationW = ctypes.windll.msi.MsiGetSummaryInformationW
MsiGetSummaryInformationW.restype = wintypes.DWORD
MsiGetSummaryInformationW.argtypes = [
    wintypes.DWORD,  # hDatabase : MSIHANDLE
    wintypes.LPCWSTR,  # szDatabasePath : LPCWSTR
    wintypes.DWORD,  # uiUpdateCount : DWORD
    ctypes.c_void_p,  # phSummaryInfo : MSIHANDLE* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('msi.dll')
MsiGetSummaryInformationW = Fiddle::Function.new(
  lib['MsiGetSummaryInformationW'],
  [
    -Fiddle::TYPE_INT,  # hDatabase : MSIHANDLE
    Fiddle::TYPE_VOIDP,  # szDatabasePath : LPCWSTR
    -Fiddle::TYPE_INT,  # uiUpdateCount : DWORD
    Fiddle::TYPE_VOIDP,  # phSummaryInfo : MSIHANDLE* in/out
  ],
  -Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "msi")]
extern "system" {
    fn MsiGetSummaryInformationW(
        hDatabase: u32,  // MSIHANDLE
        szDatabasePath: *const u16,  // LPCWSTR
        uiUpdateCount: u32,  // DWORD
        phSummaryInfo: *mut u32  // MSIHANDLE* in/out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("msi.dll", CharSet = CharSet.Unicode)]
public static extern uint MsiGetSummaryInformationW(uint hDatabase, [MarshalAs(UnmanagedType.LPWStr)] string szDatabasePath, uint uiUpdateCount, ref uint phSummaryInfo);
"@
$api = Add-Type -MemberDefinition $sig -Name 'msi_MsiGetSummaryInformationW' -Namespace Win32 -PassThru
# $api::MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
#uselib "msi.dll"
#func global MsiGetSummaryInformationW "MsiGetSummaryInformationW" wptr, wptr, wptr, wptr
; MsiGetSummaryInformationW hDatabase, szDatabasePath, uiUpdateCount, varptr(phSummaryInfo)   ; 戻り値は stat
; hDatabase : MSIHANDLE -> "wptr"
; szDatabasePath : LPCWSTR -> "wptr"
; uiUpdateCount : DWORD -> "wptr"
; phSummaryInfo : MSIHANDLE* in/out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "msi.dll"
#cfunc global MsiGetSummaryInformationW "MsiGetSummaryInformationW" int, wstr, int, var
; res = MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
; hDatabase : MSIHANDLE -> "int"
; szDatabasePath : LPCWSTR -> "wstr"
; uiUpdateCount : DWORD -> "int"
; phSummaryInfo : MSIHANDLE* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD MsiGetSummaryInformationW(MSIHANDLE hDatabase, LPCWSTR szDatabasePath, DWORD uiUpdateCount, MSIHANDLE* phSummaryInfo)
#uselib "msi.dll"
#cfunc global MsiGetSummaryInformationW "MsiGetSummaryInformationW" int, wstr, int, var
; res = MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
; hDatabase : MSIHANDLE -> "int"
; szDatabasePath : LPCWSTR -> "wstr"
; uiUpdateCount : DWORD -> "int"
; phSummaryInfo : MSIHANDLE* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	msi = windows.NewLazySystemDLL("msi.dll")
	procMsiGetSummaryInformationW = msi.NewProc("MsiGetSummaryInformationW")
)

// hDatabase (MSIHANDLE), szDatabasePath (LPCWSTR), uiUpdateCount (DWORD), phSummaryInfo (MSIHANDLE* in/out)
r1, _, err := procMsiGetSummaryInformationW.Call(
	uintptr(hDatabase),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(szDatabasePath))),
	uintptr(uiUpdateCount),
	uintptr(phSummaryInfo),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function MsiGetSummaryInformationW(
  hDatabase: DWORD;   // MSIHANDLE
  szDatabasePath: PWideChar;   // LPCWSTR
  uiUpdateCount: DWORD;   // DWORD
  phSummaryInfo: Pointer   // MSIHANDLE* in/out
): DWORD; stdcall;
  external 'msi.dll' name 'MsiGetSummaryInformationW';
result := DllCall("msi\MsiGetSummaryInformationW"
    , "UInt", hDatabase   ; MSIHANDLE
    , "WStr", szDatabasePath   ; LPCWSTR
    , "UInt", uiUpdateCount   ; DWORD
    , "Ptr", phSummaryInfo   ; MSIHANDLE* in/out
    , "UInt")   ; return: DWORD
●MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo) = DLL("msi.dll", "dword MsiGetSummaryInformationW(dword, char*, dword, void*)")
# 呼び出し: MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
# hDatabase : MSIHANDLE -> "dword"
# szDatabasePath : LPCWSTR -> "char*"
# uiUpdateCount : DWORD -> "dword"
# phSummaryInfo : MSIHANDLE* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "msi" fn MsiGetSummaryInformationW(
    hDatabase: u32, // MSIHANDLE
    szDatabasePath: [*c]const u16, // LPCWSTR
    uiUpdateCount: u32, // DWORD
    phSummaryInfo: [*c]u32 // MSIHANDLE* in/out
) callconv(std.os.windows.WINAPI) u32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc MsiGetSummaryInformationW(
    hDatabase: uint32,  # MSIHANDLE
    szDatabasePath: WideCString,  # LPCWSTR
    uiUpdateCount: uint32,  # DWORD
    phSummaryInfo: ptr uint32  # MSIHANDLE* in/out
): uint32 {.importc: "MsiGetSummaryInformationW", stdcall, dynlib: "msi.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "msi");
extern(Windows)
uint MsiGetSummaryInformationW(
    uint hDatabase,   // MSIHANDLE
    const(wchar)* szDatabasePath,   // LPCWSTR
    uint uiUpdateCount,   // DWORD
    uint* phSummaryInfo   // MSIHANDLE* in/out
);
ccall((:MsiGetSummaryInformationW, "msi.dll"), stdcall, UInt32,
      (UInt32, Cwstring, UInt32, Ptr{UInt32}),
      hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
# hDatabase : MSIHANDLE -> UInt32
# szDatabasePath : LPCWSTR -> Cwstring
# uiUpdateCount : DWORD -> UInt32
# phSummaryInfo : MSIHANDLE* in/out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
uint32_t MsiGetSummaryInformationW(
    uint32_t hDatabase,
    const uint16_t* szDatabasePath,
    uint32_t uiUpdateCount,
    uint32_t* phSummaryInfo);
]]
local msi = ffi.load("msi")
-- msi.MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
-- hDatabase : MSIHANDLE
-- szDatabasePath : LPCWSTR
-- uiUpdateCount : DWORD
-- phSummaryInfo : MSIHANDLE* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('msi.dll');
const MsiGetSummaryInformationW = lib.func('__stdcall', 'MsiGetSummaryInformationW', 'uint32_t', ['uint32_t', 'str16', 'uint32_t', 'uint32_t *']);
// MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
// hDatabase : MSIHANDLE -> 'uint32_t'
// szDatabasePath : LPCWSTR -> 'str16'
// uiUpdateCount : DWORD -> 'uint32_t'
// phSummaryInfo : MSIHANDLE* in/out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("msi.dll", {
  MsiGetSummaryInformationW: { parameters: ["u32", "buffer", "u32", "pointer"], result: "u32" },
});
// lib.symbols.MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo)
// hDatabase : MSIHANDLE -> "u32"
// szDatabasePath : LPCWSTR -> "buffer"
// uiUpdateCount : DWORD -> "u32"
// phSummaryInfo : MSIHANDLE* in/out -> "pointer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t MsiGetSummaryInformationW(
    uint32_t hDatabase,
    const uint16_t* szDatabasePath,
    uint32_t uiUpdateCount,
    uint32_t* phSummaryInfo);
C, "msi.dll");
// $ffi->MsiGetSummaryInformationW(hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo);
// hDatabase : MSIHANDLE
// szDatabasePath : LPCWSTR
// uiUpdateCount : DWORD
// phSummaryInfo : MSIHANDLE* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Msi extends StdCallLibrary {
    Msi INSTANCE = Native.load("msi", Msi.class, W32APIOptions.UNICODE_OPTIONS);
    int MsiGetSummaryInformationW(
        int hDatabase,   // MSIHANDLE
        WString szDatabasePath,   // LPCWSTR
        int uiUpdateCount,   // DWORD
        IntByReference phSummaryInfo   // MSIHANDLE* in/out
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("msi")]
lib Libmsi
  fun MsiGetSummaryInformationW = MsiGetSummaryInformationW(
    hDatabase : UInt32,   # MSIHANDLE
    szDatabasePath : UInt16*,   # LPCWSTR
    uiUpdateCount : UInt32,   # DWORD
    phSummaryInfo : UInt32*   # MSIHANDLE* in/out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef MsiGetSummaryInformationWNative = Uint32 Function(Uint32, Pointer<Utf16>, Uint32, Pointer<Uint32>);
typedef MsiGetSummaryInformationWDart = int Function(int, Pointer<Utf16>, int, Pointer<Uint32>);
final MsiGetSummaryInformationW = DynamicLibrary.open('msi.dll')
    .lookupFunction<MsiGetSummaryInformationWNative, MsiGetSummaryInformationWDart>('MsiGetSummaryInformationW');
// hDatabase : MSIHANDLE -> Uint32
// szDatabasePath : LPCWSTR -> Pointer<Utf16>
// uiUpdateCount : DWORD -> Uint32
// phSummaryInfo : MSIHANDLE* in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MsiGetSummaryInformationW(
  hDatabase: DWORD;   // MSIHANDLE
  szDatabasePath: PWideChar;   // LPCWSTR
  uiUpdateCount: DWORD;   // DWORD
  phSummaryInfo: Pointer   // MSIHANDLE* in/out
): DWORD; stdcall;
  external 'msi.dll' name 'MsiGetSummaryInformationW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "MsiGetSummaryInformationW"
  c_MsiGetSummaryInformationW :: Word32 -> CWString -> Word32 -> Ptr Word32 -> IO Word32
-- hDatabase : MSIHANDLE -> Word32
-- szDatabasePath : LPCWSTR -> CWString
-- uiUpdateCount : DWORD -> Word32
-- phSummaryInfo : MSIHANDLE* in/out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let msigetsummaryinformationw =
  foreign "MsiGetSummaryInformationW"
    (uint32_t @-> (ptr uint16_t) @-> uint32_t @-> (ptr uint32_t) @-> returning uint32_t)
(* hDatabase : MSIHANDLE -> uint32_t *)
(* szDatabasePath : LPCWSTR -> (ptr uint16_t) *)
(* uiUpdateCount : DWORD -> uint32_t *)
(* phSummaryInfo : MSIHANDLE* in/out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library msi (t "msi.dll"))
(cffi:use-foreign-library msi)

(cffi:defcfun ("MsiGetSummaryInformationW" msi-get-summary-information-w :convention :stdcall) :uint32
  (h-database :uint32)   ; MSIHANDLE
  (sz-database-path (:string :encoding :utf-16le))   ; LPCWSTR
  (ui-update-count :uint32)   ; DWORD
  (ph-summary-info :pointer))   ; MSIHANDLE* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MsiGetSummaryInformationW = Win32::API::More->new('msi',
    'DWORD MsiGetSummaryInformationW(DWORD hDatabase, LPCWSTR szDatabasePath, DWORD uiUpdateCount, LPVOID phSummaryInfo)');
# my $ret = $MsiGetSummaryInformationW->Call($hDatabase, $szDatabasePath, $uiUpdateCount, $phSummaryInfo);
# hDatabase : MSIHANDLE -> DWORD
# szDatabasePath : LPCWSTR -> LPCWSTR
# uiUpdateCount : DWORD -> DWORD
# phSummaryInfo : MSIHANDLE* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い