SetupGetFileCompressionInfoW
関数シグネチャ
// SETUPAPI.dll (Unicode / -W)
#include <windows.h>
DWORD SetupGetFileCompressionInfoW(
LPCWSTR SourceFileName,
LPWSTR* ActualSourceFileName,
DWORD* SourceFileSize,
DWORD* TargetFileSize,
FILE_COMPRESSION_TYPE* CompressionType
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| SourceFileName | LPCWSTR | in | 情報を取得する対象のファイルのファイル名。指定された名前どおりのファイルがソースメディア上に見つからない場合、最大 2 つの代替の「圧縮形式」の名前でファイルが検索されます。たとえば、ファイルが F:\x86\cmd.exe で、それが見つからない場合は F:\mpis\cmd.ex_ が検索され、それも見つからない場合は F:\x86\cmd.ex$ が検索されます。null で終わる文字列を使用してください。 |
| ActualSourceFileName | LPWSTR* | out | 検出できたファイルのフルパスを受け取る変数へのポインター。呼び出し元は LocalFree を呼び出してこのポインターを解放できます。このパスは、関数が NO_ERROR を返した場合にのみ有効です。なお、SetupAPI.dll のバージョンが 5.0.2195 未満の場合、呼び出し元はこの関数が割り当てたメモリを解放するために、LocalFree ではなく SetupAPI からエクスポートされている関数 MyFree を使用する必要があります。「解説」セクションを参照してください。 |
| SourceFileSize | DWORD* | out | 現在の形式でのファイルのサイズ、つまり ActualSourceFileName で示されるファイルの現在のサイズをこの関数が返す変数へのポインター。このサイズはソースファイルを調べることで決定され、INF ファイルから取得されるものではありません。ソースファイルのサイズは、関数が NO_ERROR を返した場合にのみ有効です。 |
| TargetFileSize | DWORD* | out | ファイルが圧縮解除またはコピーされたときに占めるサイズをこの関数が返す変数へのポインター。ファイルが圧縮されていない場合、この値は SourceFileSize と同じになります。このサイズはファイルを調べることで決定され、INF ファイルから取得されるものではありません。ターゲットファイルのサイズは、関数が NO_ERROR を返した場合にのみ有効です。 |
| CompressionType | FILE_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 公式リファレンス: 英語 (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 方式にも切替可。#uselib "SETUPAPI.dll" #cfunc global SetupGetFileCompressionInfoW "SetupGetFileCompressionInfoW" wstr, sptr, sptr, sptr, sptr ; res = SetupGetFileCompressionInfoW(SourceFileName, varptr(ActualSourceFileName), varptr(SourceFileSize), varptr(TargetFileSize), varptr(CompressionType)) ; SourceFileName : LPCWSTR -> "wstr" ; ActualSourceFileName : LPWSTR* out -> "sptr" ; SourceFileSize : DWORD* out -> "sptr" ; TargetFileSize : DWORD* out -> "sptr" ; CompressionType : FILE_COMPRESSION_TYPE* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; DWORD SetupGetFileCompressionInfoW(LPCWSTR SourceFileName, LPWSTR* ActualSourceFileName, DWORD* SourceFileSize, DWORD* TargetFileSize, FILE_COMPRESSION_TYPE* CompressionType) #uselib "SETUPAPI.dll" #cfunc global SetupGetFileCompressionInfoW "SetupGetFileCompressionInfoW" wstr, intptr, intptr, intptr, intptr ; res = SetupGetFileCompressionInfoW(SourceFileName, varptr(ActualSourceFileName), varptr(SourceFileSize), varptr(TargetFileSize), varptr(CompressionType)) ; SourceFileName : LPCWSTR -> "wstr" ; ActualSourceFileName : LPWSTR* out -> "intptr" ; SourceFileSize : DWORD* out -> "intptr" ; TargetFileSize : DWORD* out -> "intptr" ; CompressionType : FILE_COMPRESSION_TYPE* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // DWORDfunction 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 変換を行う。関連項目
- f SetupGetFileCompressionInfoA (ANSI版) — ソースファイルの圧縮形式やサイズ情報を取得する(ANSI)。
- f SetupGetFileCompressionInfoExW — ソースファイルの圧縮情報を拡張バッファ指定で取得する(Unicode)。
- f SetupDecompressOrCopyFileW — ファイルを必要に応じて展開しつつコピーする(Unicode)。