Win32 API 日本語リファレンス
ホームDevices.DeviceAndDriverInstallation › SetupGetFileCompressionInfoW

SetupGetFileCompressionInfoW

関数
ソースファイルの圧縮形式やサイズ情報を取得する(Unicode)。
DLLSETUPAPI.dll文字セットUnicode (-W)呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

DWORD SetupGetFileCompressionInfoW(
    LPCWSTR SourceFileName,
    LPWSTR* ActualSourceFileName,
    DWORD* SourceFileSize,
    DWORD* TargetFileSize,
    FILE_COMPRESSION_TYPE* CompressionType
);

パラメーター

名前方向説明
SourceFileNameLPCWSTRin情報を取得する対象のファイルのファイル名。指定された名前どおりのファイルがソースメディア上に見つからない場合、最大 2 つの代替の「圧縮形式」の名前でファイルが検索されます。たとえば、ファイルが F:\x86\cmd.exe で、それが見つからない場合は F:\mpis\cmd.ex_ が検索され、それも見つからない場合は F:\x86\cmd.ex$ が検索されます。null で終わる文字列を使用してください。
ActualSourceFileNameLPWSTR*out検出できたファイルのフルパスを受け取る変数へのポインター。呼び出し元は LocalFree を呼び出してこのポインターを解放できます。このパスは、関数が NO_ERROR を返した場合にのみ有効です。なお、SetupAPI.dll のバージョンが 5.0.2195 未満の場合、呼び出し元はこの関数が割り当てたメモリを解放するために、LocalFree ではなく SetupAPI からエクスポートされている関数 MyFree を使用する必要があります。「解説」セクションを参照してください。
SourceFileSizeDWORD*out現在の形式でのファイルのサイズ、つまり ActualSourceFileName で示されるファイルの現在のサイズをこの関数が返す変数へのポインター。このサイズはソースファイルを調べることで決定され、INF ファイルから取得されるものではありません。ソースファイルのサイズは、関数が NO_ERROR を返した場合にのみ有効です。
TargetFileSizeDWORD*outファイルが圧縮解除またはコピーされたときに占めるサイズをこの関数が返す変数へのポインター。ファイルが圧縮されていない場合、この値は SourceFileSize と同じになります。このサイズはファイルを調べることで決定され、INF ファイルから取得されるものではありません。ターゲットファイルのサイズは、関数が NO_ERROR を返した場合にのみ有効です。
CompressionTypeFILE_COMPRESSION_TYPE*out

ActualSourceFileName に使用されている圧縮の種類を示す値をこの関数が返す変数へのポインター。圧縮の種類は、関数が NO_ERROR を返した場合にのみ有効です。この値には次のフラグのいずれかを指定できます。

FILE_COMPRESSION_NONE

ソースファイルは、認識可能な圧縮アルゴリズムでは圧縮されていません。

FILE_COMPRESSION_WINLZA

ソースファイルは LZ 圧縮で圧縮されています。

FILE_COMPRESSION_MSZIP

ソースファイルは MSZIP 圧縮で圧縮されています。

- CompressionType.FILE_COMPRESSION_MSZIP

ソースファイルは MSZIP 圧縮で圧縮されています。

- CompressionType.FILE_COMPRESSION_NONE

ソースファイルは、認識可能な圧縮アルゴリズムでは圧縮されていません。

- CompressionType.FILE_COMPRESSION_WINLZA

ソースファイルは LZ 圧縮で圧縮されています。

戻り値の型: DWORD

公式ドキュメント

SetupGetFileCompressionInfo 関数は、物理ファイルを調べて圧縮されているかどうかを判定し、そのフルパス、サイズ、および圧縮解除後のターゲットファイルのサイズを取得します。(Unicode)

戻り値

この関数は、ファイル検索の結果を示す システムエラーコード を返します。エラーコードは次の値のいずれかになります。

拡張エラー情報を取得するには、 GetLastError を呼び出します。

解説(Remarks)

SetupGetFileCompressionInfo は使用しないでください。代わりに常に SetupGetFileCompressionInfoEx を使用してください。

SetupGetFileCompressionInfo は物理ファイルを参照して圧縮を判定するため、セットアップアプリケーションは SetupGetFileCompressionInfo を呼び出す前に、対象のファイルが存在することを確認する必要があります。

なお、SetupAPI.dll のバージョンが 5.0.2195 未満の場合、呼び出し元はこの関数が割り当てたメモリを解放するために、LocalFree ではなく SetupAPI からエクスポートされている関数 MyFree を使用する必要があります。LocalFree の呼び出しでアクセス違反が発生する場合は、MyFree を使用することで問題を解決してください。

次に、SetupAPI.dll から MyFree 関数を取得する方法の例を示します。

typedef VOID (WINAPI* MYFREEFUNC)(LPVOID lpBuff);
   MYFREEFUNC MyFree;

   HMODULE hDll=NULL;
   hDll = GetModuleHandle("SETUPAPI.DLL");
   MyFree = (MYFREEFUNC)GetProcAddress(hDll, "MyFree");
   ...
   other code here to prepare file queue
   ...
   PTSTR lpActualSourceFileName;
   SetupGetFileCompressionInfo(...,&lpActualSourceFileName,...,...,...);
   ...
   MyFree(lpActualSourceFileName); 
メモ

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

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

各言語での呼び出し定義

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

DWORD SetupGetFileCompressionInfoW(
    LPCWSTR SourceFileName,
    LPWSTR* ActualSourceFileName,
    DWORD* SourceFileSize,
    DWORD* TargetFileSize,
    FILE_COMPRESSION_TYPE* CompressionType
);
[DllImport("SETUPAPI.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern uint SetupGetFileCompressionInfoW(
    [MarshalAs(UnmanagedType.LPWStr)] string SourceFileName,   // LPCWSTR
    IntPtr ActualSourceFileName,   // LPWSTR* out
    out uint SourceFileSize,   // DWORD* out
    out uint TargetFileSize,   // DWORD* out
    out uint CompressionType   // FILE_COMPRESSION_TYPE* out
);
<DllImport("SETUPAPI.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function SetupGetFileCompressionInfoW(
    <MarshalAs(UnmanagedType.LPWStr)> SourceFileName As String,   ' LPCWSTR
    ActualSourceFileName As IntPtr,   ' LPWSTR* out
    <Out> ByRef SourceFileSize As UInteger,   ' DWORD* out
    <Out> ByRef TargetFileSize As UInteger,   ' DWORD* out
    <Out> ByRef CompressionType As UInteger   ' FILE_COMPRESSION_TYPE* out
) As UInteger
End Function
' SourceFileName : LPCWSTR
' ActualSourceFileName : LPWSTR* out
' SourceFileSize : DWORD* out
' TargetFileSize : DWORD* out
' CompressionType : FILE_COMPRESSION_TYPE* out
Declare PtrSafe Function SetupGetFileCompressionInfoW Lib "setupapi" ( _
    ByVal SourceFileName As LongPtr, _
    ByVal ActualSourceFileName As LongPtr, _
    ByRef SourceFileSize As Long, _
    ByRef TargetFileSize As Long, _
    ByRef CompressionType 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

SetupGetFileCompressionInfoW = ctypes.windll.setupapi.SetupGetFileCompressionInfoW
SetupGetFileCompressionInfoW.restype = wintypes.DWORD
SetupGetFileCompressionInfoW.argtypes = [
    wintypes.LPCWSTR,  # SourceFileName : LPCWSTR
    ctypes.c_void_p,  # ActualSourceFileName : LPWSTR* out
    ctypes.POINTER(wintypes.DWORD),  # SourceFileSize : DWORD* out
    ctypes.POINTER(wintypes.DWORD),  # TargetFileSize : DWORD* out
    ctypes.c_void_p,  # CompressionType : FILE_COMPRESSION_TYPE* out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

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

var (
	setupapi = windows.NewLazySystemDLL("SETUPAPI.dll")
	procSetupGetFileCompressionInfoW = setupapi.NewProc("SetupGetFileCompressionInfoW")
)

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

extern "setupapi" fn SetupGetFileCompressionInfoW(
    SourceFileName: [*c]const u16, // LPCWSTR
    ActualSourceFileName: [*c][*c]u16, // LPWSTR* out
    SourceFileSize: [*c]u32, // DWORD* out
    TargetFileSize: [*c]u32, // DWORD* out
    CompressionType: [*c]u32 // FILE_COMPRESSION_TYPE* out
) callconv(std.os.windows.WINAPI) u32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc SetupGetFileCompressionInfoW(
    SourceFileName: WideCString,  # LPCWSTR
    ActualSourceFileName: ptr WideCString,  # LPWSTR* out
    SourceFileSize: ptr uint32,  # DWORD* out
    TargetFileSize: ptr uint32,  # DWORD* out
    CompressionType: ptr uint32  # FILE_COMPRESSION_TYPE* out
): uint32 {.importc: "SetupGetFileCompressionInfoW", stdcall, dynlib: "SETUPAPI.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "setupapi");
extern(Windows)
uint SetupGetFileCompressionInfoW(
    const(wchar)* SourceFileName,   // LPCWSTR
    wchar** ActualSourceFileName,   // LPWSTR* out
    uint* SourceFileSize,   // DWORD* out
    uint* TargetFileSize,   // DWORD* out
    uint* CompressionType   // FILE_COMPRESSION_TYPE* out
);
ccall((:SetupGetFileCompressionInfoW, "SETUPAPI.dll"), stdcall, UInt32,
      (Cwstring, Ptr{Ptr{UInt16}}, Ptr{UInt32}, Ptr{UInt32}, Ptr{UInt32}),
      SourceFileName, ActualSourceFileName, SourceFileSize, TargetFileSize, CompressionType)
# SourceFileName : LPCWSTR -> Cwstring
# ActualSourceFileName : LPWSTR* out -> Ptr{Ptr{UInt16}}
# SourceFileSize : DWORD* out -> Ptr{UInt32}
# TargetFileSize : DWORD* out -> Ptr{UInt32}
# CompressionType : FILE_COMPRESSION_TYPE* out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
uint32_t SetupGetFileCompressionInfoW(
    const uint16_t* SourceFileName,
    uint16_t** ActualSourceFileName,
    uint32_t* SourceFileSize,
    uint32_t* TargetFileSize,
    uint32_t* CompressionType);
]]
local setupapi = ffi.load("setupapi")
-- setupapi.SetupGetFileCompressionInfoW(SourceFileName, ActualSourceFileName, SourceFileSize, TargetFileSize, CompressionType)
-- SourceFileName : LPCWSTR
-- ActualSourceFileName : LPWSTR* out
-- SourceFileSize : DWORD* out
-- TargetFileSize : DWORD* out
-- CompressionType : FILE_COMPRESSION_TYPE* 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('SETUPAPI.dll');
const SetupGetFileCompressionInfoW = lib.func('__stdcall', 'SetupGetFileCompressionInfoW', 'uint32_t', ['str16', 'void *', 'uint32_t *', 'uint32_t *', 'uint32_t *']);
// SetupGetFileCompressionInfoW(SourceFileName, ActualSourceFileName, SourceFileSize, TargetFileSize, CompressionType)
// SourceFileName : LPCWSTR -> 'str16'
// ActualSourceFileName : LPWSTR* out -> 'void *'
// SourceFileSize : DWORD* out -> 'uint32_t *'
// TargetFileSize : DWORD* out -> 'uint32_t *'
// CompressionType : FILE_COMPRESSION_TYPE* out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("SETUPAPI.dll", {
  SetupGetFileCompressionInfoW: { parameters: ["buffer", "pointer", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.SetupGetFileCompressionInfoW(SourceFileName, ActualSourceFileName, SourceFileSize, TargetFileSize, CompressionType)
// SourceFileName : LPCWSTR -> "buffer"
// ActualSourceFileName : LPWSTR* out -> "pointer"
// SourceFileSize : DWORD* out -> "pointer"
// TargetFileSize : DWORD* out -> "pointer"
// CompressionType : FILE_COMPRESSION_TYPE* out -> "pointer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t SetupGetFileCompressionInfoW(
    const uint16_t* SourceFileName,
    uint16_t** ActualSourceFileName,
    uint32_t* SourceFileSize,
    uint32_t* TargetFileSize,
    uint32_t* CompressionType);
C, "SETUPAPI.dll");
// $ffi->SetupGetFileCompressionInfoW(SourceFileName, ActualSourceFileName, SourceFileSize, TargetFileSize, CompressionType);
// SourceFileName : LPCWSTR
// ActualSourceFileName : LPWSTR* out
// SourceFileSize : DWORD* out
// TargetFileSize : DWORD* out
// CompressionType : FILE_COMPRESSION_TYPE* 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 Setupapi extends StdCallLibrary {
    Setupapi INSTANCE = Native.load("setupapi", Setupapi.class, W32APIOptions.UNICODE_OPTIONS);
    int SetupGetFileCompressionInfoW(
        WString SourceFileName,   // LPCWSTR
        PointerByReference ActualSourceFileName,   // LPWSTR* out
        IntByReference SourceFileSize,   // DWORD* out
        IntByReference TargetFileSize,   // DWORD* out
        IntByReference CompressionType   // FILE_COMPRESSION_TYPE* out
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("setupapi")]
lib LibSETUPAPI
  fun SetupGetFileCompressionInfoW = SetupGetFileCompressionInfoW(
    SourceFileName : UInt16*,   # LPCWSTR
    ActualSourceFileName : UInt16**,   # LPWSTR* out
    SourceFileSize : UInt32*,   # DWORD* out
    TargetFileSize : UInt32*,   # DWORD* out
    CompressionType : UInt32*   # FILE_COMPRESSION_TYPE* out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SetupGetFileCompressionInfoWNative = Uint32 Function(Pointer<Utf16>, Pointer<Pointer<Utf16>>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint32>);
typedef SetupGetFileCompressionInfoWDart = int Function(Pointer<Utf16>, Pointer<Pointer<Utf16>>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint32>);
final SetupGetFileCompressionInfoW = DynamicLibrary.open('SETUPAPI.dll')
    .lookupFunction<SetupGetFileCompressionInfoWNative, SetupGetFileCompressionInfoWDart>('SetupGetFileCompressionInfoW');
// SourceFileName : LPCWSTR -> Pointer<Utf16>
// ActualSourceFileName : LPWSTR* out -> Pointer<Pointer<Utf16>>
// SourceFileSize : DWORD* out -> Pointer<Uint32>
// TargetFileSize : DWORD* out -> Pointer<Uint32>
// CompressionType : FILE_COMPRESSION_TYPE* out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SetupGetFileCompressionInfoW(
  SourceFileName: PWideChar;   // LPCWSTR
  ActualSourceFileName: PPWideChar;   // LPWSTR* out
  SourceFileSize: Pointer;   // DWORD* out
  TargetFileSize: Pointer;   // DWORD* out
  CompressionType: Pointer   // FILE_COMPRESSION_TYPE* out
): DWORD; stdcall;
  external 'SETUPAPI.dll' name 'SetupGetFileCompressionInfoW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SetupGetFileCompressionInfoW"
  c_SetupGetFileCompressionInfoW :: CWString -> Ptr CWString -> Ptr Word32 -> Ptr Word32 -> Ptr Word32 -> IO Word32
-- SourceFileName : LPCWSTR -> CWString
-- ActualSourceFileName : LPWSTR* out -> Ptr CWString
-- SourceFileSize : DWORD* out -> Ptr Word32
-- TargetFileSize : DWORD* out -> Ptr Word32
-- CompressionType : FILE_COMPRESSION_TYPE* out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let setupgetfilecompressioninfow =
  foreign "SetupGetFileCompressionInfoW"
    ((ptr uint16_t) @-> (ptr (ptr uint16_t)) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> returning uint32_t)
(* SourceFileName : LPCWSTR -> (ptr uint16_t) *)
(* ActualSourceFileName : LPWSTR* out -> (ptr (ptr uint16_t)) *)
(* SourceFileSize : DWORD* out -> (ptr uint32_t) *)
(* TargetFileSize : DWORD* out -> (ptr uint32_t) *)
(* CompressionType : FILE_COMPRESSION_TYPE* out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library setupapi (t "SETUPAPI.dll"))
(cffi:use-foreign-library setupapi)

(cffi:defcfun ("SetupGetFileCompressionInfoW" setup-get-file-compression-info-w :convention :stdcall) :uint32
  (source-file-name (:string :encoding :utf-16le))   ; LPCWSTR
  (actual-source-file-name :pointer)   ; LPWSTR* out
  (source-file-size :pointer)   ; DWORD* out
  (target-file-size :pointer)   ; DWORD* out
  (compression-type :pointer))   ; FILE_COMPRESSION_TYPE* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SetupGetFileCompressionInfoW = Win32::API::More->new('SETUPAPI',
    'DWORD SetupGetFileCompressionInfoW(LPCWSTR SourceFileName, LPVOID ActualSourceFileName, LPVOID SourceFileSize, LPVOID TargetFileSize, LPVOID CompressionType)');
# my $ret = $SetupGetFileCompressionInfoW->Call($SourceFileName, $ActualSourceFileName, $SourceFileSize, $TargetFileSize, $CompressionType);
# SourceFileName : LPCWSTR -> LPCWSTR
# ActualSourceFileName : LPWSTR* out -> LPVOID
# SourceFileSize : DWORD* out -> LPVOID
# TargetFileSize : DWORD* out -> LPVOID
# CompressionType : FILE_COMPRESSION_TYPE* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い
類似 API
公式の関連項目
使用する型