Win32 API 日本語リファレンス
ホームStorage.FileSystem › LZOpenFileW

LZOpenFileW

関数
LZ展開用にファイルを開く(Unicode版)。
DLLKERNEL32.dll文字セットUnicode (-W)呼出規約winapi対応OSWindows XP 以降

シグネチャ

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

INT LZOpenFileW(
    LPWSTR lpFileName,
    OFSTRUCT* lpReOpenBuf,
    LZOPENFILE_STYLE wStyle
);

パラメーター

名前方向説明
lpFileNameLPWSTRinファイルの名前。
lpReOpenBufOFSTRUCT*inout

ファイルが最初にオープンされたときにそのファイルに関する情報を受け取る OFSTRUCT 構造体へのポインター。この構造体は、オープン済みのファイルを参照するために以降の LZOpenFile 関数の呼び出しで使用できます。

この構造体の szPathName メンバーには、original equipment manufacturer (OEM) 文字セットの文字が格納されます。

wStyleLZOPENFILE_STYLEin

実行する操作。このパラメーターには、次の値のうち 1 つ以上を指定できます。

意味
OF_CANCEL
0x0800
無視されます。16 ビット Windows との互換性のためにのみ提供されています。Cancel ボタンを含むダイアログ ボックスを表示するには、OF_PROMPT スタイルを使用してください。
OF_CREATE
0x1000
LZOpenFile に新しいファイルを作成するよう指示します。ファイルが既に存在する場合は、 長さ 0 に切り詰められます。
OF_DELETE
0x0200
ファイルを削除します。
OF_EXIST
0x4000
ファイルの存在を確認するために、ファイルをオープンしてからクローズします。
OF_PARSE
0x0100
OFSTRUCT 構造体を埋めますが、それ以外の 操作は行いません。
OF_PROMPT
0x2000
要求されたファイルが存在しない場合にダイアログ ボックスを表示します。このダイアログ ボックスは、 システムがファイルを見つけられないことをユーザーに通知し、Retry および Cancel ボタンを含みます。Cancel ボタンをクリックすると、 LZOpenFile はファイルが見つからないというエラー メッセージを返します。
OF_READ
0x0000
ファイルを読み取り専用でオープンします。
OF_READWRITE
0x0002
ファイルを読み取りおよび書き込み用にオープンします。
OF_REOPEN
0x8000
再オープン用バッファーの情報を使用してファイルをオープンします。
OF_SHARE_DENY_NONE
0x0040
他のプロセスによるファイルへの読み取りまたは書き込みアクセスを拒否せずにファイルをオープンします。 ファイルが他のいずれかのプロセスによって互換モードでオープンされている場合、LZOpenFile は失敗します。
OF_SHARE_DENY_READ
0x0030
ファイルをオープンし、他のプロセスによるファイルへの読み取りアクセスを拒否します。 ファイルが他のいずれかのプロセスによって互換モードでオープンされているか、読み取りアクセス用にオープンされている場合、 LZOpenFile は失敗します。
OF_SHARE_DENY_WRITE
0x0020
ファイルをオープンし、他のプロセスによるファイルへの書き込みアクセスを拒否します。 ファイルが他のいずれかのプロセスによって互換モードでオープンされているか、書き込みアクセス用にオープンされている場合、 LZOpenFile は失敗します。
OF_SHARE_EXCLUSIVE
0x0010
ファイルを排他モードでオープンし、他のプロセスによるファイルへの読み取りおよび書き込みの両方のアクセスを拒否します。 ファイルが、現在のプロセス自身を含むいずれかのプロセスによって、読み取りまたは書き込みアクセス用に他のモードでオープンされている場合、 LZOpenFile は失敗します。
OF_WRITE
0x0001
ファイルを書き込み専用でオープンします。

戻り値の型: INT

公式ドキュメント

指定したファイルを作成、オープン、再オープン、または削除します。(Unicode)

戻り値

関数が成功し、wStyle パラメーターで指定された値が OF_READ でない場合、戻り値はファイルを識別するハンドルです。ファイルが圧縮されており、 wStyleOF_READ を設定してオープンした場合、戻り値は 特殊なファイル ハンドルになります。

関数が失敗した場合、戻り値は LZERROR_* コードです。これらのコードは 0 未満の値を持ちます。この関数には拡張エラー情報はありません。 GetLastError を呼び出さないでください。

注意 LZOpenFileSetLastErrorSetLastErrorEx も呼び出しません。したがって、この関数の失敗が スレッドの最終エラー コードに影響することはありません。
以下は、LZOpenFile が失敗時に 返す可能性があるエラー コードの一覧です。
戻り値コード/値 説明
LZERROR_BADINHANDLE
-1
ソース ファイルを識別するハンドルが無効です。ファイルを読み取ることができません。
LZERROR_GLOBALLOC
-5
オープン可能な圧縮ファイルの最大数を超えたか、ローカル メモリを割り当てることができません。

解説(Remarks)

wStyle パラメーターが OF_READ フラグ(または OF_READ と任意の OF_SHARE_* フラグの組み合わせ)であり、ファイルが 圧縮されている場合、LZOpenFileLZInit 関数を呼び出します。この関数は、 展開操作に必要な初期化を実行します。

この関数が返すハンドルは Lz32.dll の関数とのみ互換性があります。他のファイル操作には 使用しないでください。

LZOpenFilelpFileName で指定されたファイルをオープンできない場合、 一部のバージョンの Windows では、最後の文字をアンダースコア("_")に置き換えた、ほぼ同じ ファイル名のファイルをオープンしようとします。したがって、"MyProgram.exe" を オープンしようとして失敗した場合、LZOpenFile は "MyProgram.ex_" をオープンしようとします。インストール パッケージでは、ファイルが圧縮されていることを示すために、 ファイル名拡張子の最後の文字をアンダースコアに置き換えることがよくあります。たとえば、圧縮された "MyProgram.exe" は "MyProgram.ex_" という名前になっている場合があります。オープンされたファイル(存在する場合)の名前を確認するには、 lpReOpenBuf パラメーターに含まれる OFSTRUCT 構造体の szPathName メンバーを調べてください。

Windows 8 および Windows Server 2012 では、この関数は次のテクノロジでサポートされています。

テクノロジ サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 Transparent Failover (TFO) はい
SMB 3.0 with Scale-out File Shares (SO) はい
Cluster Shared Volume File System (CsvFS) はい
Resilient File System (ReFS) はい

CsvFs は圧縮ファイルに対してリダイレクト IO を行います。

メモ

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

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

各言語での呼び出し定義

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

INT LZOpenFileW(
    LPWSTR lpFileName,
    OFSTRUCT* lpReOpenBuf,
    LZOPENFILE_STYLE wStyle
);
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int LZOpenFileW(
    [MarshalAs(UnmanagedType.LPWStr)] string lpFileName,   // LPWSTR
    IntPtr lpReOpenBuf,   // OFSTRUCT* in/out
    ushort wStyle   // LZOPENFILE_STYLE
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function LZOpenFileW(
    <MarshalAs(UnmanagedType.LPWStr)> lpFileName As String,   ' LPWSTR
    lpReOpenBuf As IntPtr,   ' OFSTRUCT* in/out
    wStyle As UShort   ' LZOPENFILE_STYLE
) As Integer
End Function
' lpFileName : LPWSTR
' lpReOpenBuf : OFSTRUCT* in/out
' wStyle : LZOPENFILE_STYLE
Declare PtrSafe Function LZOpenFileW Lib "kernel32" ( _
    ByVal lpFileName As LongPtr, _
    ByVal lpReOpenBuf As LongPtr, _
    ByVal wStyle As Integer) 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

LZOpenFileW = ctypes.windll.kernel32.LZOpenFileW
LZOpenFileW.restype = ctypes.c_int
LZOpenFileW.argtypes = [
    wintypes.LPCWSTR,  # lpFileName : LPWSTR
    ctypes.c_void_p,  # lpReOpenBuf : OFSTRUCT* in/out
    ctypes.c_ushort,  # wStyle : LZOPENFILE_STYLE
]
require 'fiddle'
require 'fiddle/import'

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

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procLZOpenFileW = kernel32.NewProc("LZOpenFileW")
)

// lpFileName (LPWSTR), lpReOpenBuf (OFSTRUCT* in/out), wStyle (LZOPENFILE_STYLE)
r1, _, err := procLZOpenFileW.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpFileName))),
	uintptr(lpReOpenBuf),
	uintptr(wStyle),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function LZOpenFileW(
  lpFileName: PWideChar;   // LPWSTR
  lpReOpenBuf: Pointer;   // OFSTRUCT* in/out
  wStyle: Word   // LZOPENFILE_STYLE
): Integer; stdcall;
  external 'KERNEL32.dll' name 'LZOpenFileW';
result := DllCall("KERNEL32\LZOpenFileW"
    , "WStr", lpFileName   ; LPWSTR
    , "Ptr", lpReOpenBuf   ; OFSTRUCT* in/out
    , "UShort", wStyle   ; LZOPENFILE_STYLE
    , "Int")   ; return: INT
●LZOpenFileW(lpFileName, lpReOpenBuf, wStyle) = DLL("KERNEL32.dll", "int LZOpenFileW(char*, void*, int)")
# 呼び出し: LZOpenFileW(lpFileName, lpReOpenBuf, wStyle)
# lpFileName : LPWSTR -> "char*"
# lpReOpenBuf : OFSTRUCT* in/out -> "void*"
# wStyle : LZOPENFILE_STYLE -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "kernel32" fn LZOpenFileW(
    lpFileName: [*c]const u16, // LPWSTR
    lpReOpenBuf: [*c]OFSTRUCT, // OFSTRUCT* in/out
    wStyle: u16 // LZOPENFILE_STYLE
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc LZOpenFileW(
    lpFileName: WideCString,  # LPWSTR
    lpReOpenBuf: ptr OFSTRUCT,  # OFSTRUCT* in/out
    wStyle: uint16  # LZOPENFILE_STYLE
): int32 {.importc: "LZOpenFileW", stdcall, dynlib: "KERNEL32.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "kernel32");
extern(Windows)
int LZOpenFileW(
    const(wchar)* lpFileName,   // LPWSTR
    OFSTRUCT* lpReOpenBuf,   // OFSTRUCT* in/out
    ushort wStyle   // LZOPENFILE_STYLE
);
ccall((:LZOpenFileW, "KERNEL32.dll"), stdcall, Int32,
      (Cwstring, Ptr{OFSTRUCT}, UInt16),
      lpFileName, lpReOpenBuf, wStyle)
# lpFileName : LPWSTR -> Cwstring
# lpReOpenBuf : OFSTRUCT* in/out -> Ptr{OFSTRUCT}
# wStyle : LZOPENFILE_STYLE -> UInt16
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
int32_t LZOpenFileW(
    const uint16_t* lpFileName,
    void* lpReOpenBuf,
    uint16_t wStyle);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.LZOpenFileW(lpFileName, lpReOpenBuf, wStyle)
-- lpFileName : LPWSTR
-- lpReOpenBuf : OFSTRUCT* in/out
-- wStyle : LZOPENFILE_STYLE
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const LZOpenFileW = lib.func('__stdcall', 'LZOpenFileW', 'int32_t', ['str16', 'void *', 'uint16_t']);
// LZOpenFileW(lpFileName, lpReOpenBuf, wStyle)
// lpFileName : LPWSTR -> 'str16'
// lpReOpenBuf : OFSTRUCT* in/out -> 'void *'
// wStyle : LZOPENFILE_STYLE -> 'uint16_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  LZOpenFileW: { parameters: ["buffer", "pointer", "u16"], result: "i32" },
});
// lib.symbols.LZOpenFileW(lpFileName, lpReOpenBuf, wStyle)
// lpFileName : LPWSTR -> "buffer"
// lpReOpenBuf : OFSTRUCT* in/out -> "pointer"
// wStyle : LZOPENFILE_STYLE -> "u16"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t LZOpenFileW(
    const uint16_t* lpFileName,
    void* lpReOpenBuf,
    uint16_t wStyle);
C, "KERNEL32.dll");
// $ffi->LZOpenFileW(lpFileName, lpReOpenBuf, wStyle);
// lpFileName : LPWSTR
// lpReOpenBuf : OFSTRUCT* in/out
// wStyle : LZOPENFILE_STYLE
// 構造体/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 Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
    int LZOpenFileW(
        WString lpFileName,   // LPWSTR
        Pointer lpReOpenBuf,   // OFSTRUCT* in/out
        short wStyle   // LZOPENFILE_STYLE
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("kernel32")]
lib LibKERNEL32
  fun LZOpenFileW = LZOpenFileW(
    lpFileName : UInt16*,   # LPWSTR
    lpReOpenBuf : OFSTRUCT*,   # OFSTRUCT* in/out
    wStyle : UInt16   # LZOPENFILE_STYLE
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef LZOpenFileWNative = Int32 Function(Pointer<Utf16>, Pointer<Void>, Uint16);
typedef LZOpenFileWDart = int Function(Pointer<Utf16>, Pointer<Void>, int);
final LZOpenFileW = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<LZOpenFileWNative, LZOpenFileWDart>('LZOpenFileW');
// lpFileName : LPWSTR -> Pointer<Utf16>
// lpReOpenBuf : OFSTRUCT* in/out -> Pointer<Void>
// wStyle : LZOPENFILE_STYLE -> Uint16
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function LZOpenFileW(
  lpFileName: PWideChar;   // LPWSTR
  lpReOpenBuf: Pointer;   // OFSTRUCT* in/out
  wStyle: Word   // LZOPENFILE_STYLE
): Integer; stdcall;
  external 'KERNEL32.dll' name 'LZOpenFileW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "LZOpenFileW"
  c_LZOpenFileW :: CWString -> Ptr () -> Word16 -> IO Int32
-- lpFileName : LPWSTR -> CWString
-- lpReOpenBuf : OFSTRUCT* in/out -> Ptr ()
-- wStyle : LZOPENFILE_STYLE -> Word16
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let lzopenfilew =
  foreign "LZOpenFileW"
    ((ptr uint16_t) @-> (ptr void) @-> uint16_t @-> returning int32_t)
(* lpFileName : LPWSTR -> (ptr uint16_t) *)
(* lpReOpenBuf : OFSTRUCT* in/out -> (ptr void) *)
(* wStyle : LZOPENFILE_STYLE -> uint16_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("LZOpenFileW" lzopen-file-w :convention :stdcall) :int32
  (lp-file-name (:string :encoding :utf-16le))   ; LPWSTR
  (lp-re-open-buf :pointer)   ; OFSTRUCT* in/out
  (w-style :uint16))   ; LZOPENFILE_STYLE
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $LZOpenFileW = Win32::API::More->new('KERNEL32',
    'int LZOpenFileW(LPCWSTR lpFileName, LPVOID lpReOpenBuf, WORD wStyle)');
# my $ret = $LZOpenFileW->Call($lpFileName, $lpReOpenBuf, $wStyle);
# lpFileName : LPWSTR -> LPCWSTR
# lpReOpenBuf : OFSTRUCT* in/out -> LPVOID
# wStyle : LZOPENFILE_STYLE -> WORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

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