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

LZOpenFileA

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

シグネチャ

// KERNEL32.dll  (ANSI / -A)
#include <windows.h>

INT LZOpenFileA(
    LPSTR lpFileName,
    OFSTRUCT* lpReOpenBuf,
    LZOPENFILE_STYLE wStyle
);

パラメーター

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

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

この構造体の szPathName メンバーには、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

公式ドキュメント

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

戻り値

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

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

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

解説(Remarks)

wStyle パラメーターが OF_READ フラグ(または OF_READOF_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 透過的フェールオーバー (TFO) はい
スケールアウト ファイル共有 (SO) を使用した SMB 3.0 はい
クラスターの共有ボリューム ファイル システム (CsvFS) はい
回復性ファイル システム (ReFS) はい

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

メモ

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

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

各言語での呼び出し定義

// KERNEL32.dll  (ANSI / -A)
#include <windows.h>

INT LZOpenFileA(
    LPSTR lpFileName,
    OFSTRUCT* lpReOpenBuf,
    LZOPENFILE_STYLE wStyle
);
[DllImport("KERNEL32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern int LZOpenFileA(
    [MarshalAs(UnmanagedType.LPStr)] string lpFileName,   // LPSTR
    IntPtr lpReOpenBuf,   // OFSTRUCT* in/out
    ushort wStyle   // LZOPENFILE_STYLE
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function LZOpenFileA(
    <MarshalAs(UnmanagedType.LPStr)> lpFileName As String,   ' LPSTR
    lpReOpenBuf As IntPtr,   ' OFSTRUCT* in/out
    wStyle As UShort   ' LZOPENFILE_STYLE
) As Integer
End Function
' lpFileName : LPSTR
' lpReOpenBuf : OFSTRUCT* in/out
' wStyle : LZOPENFILE_STYLE
Declare PtrSafe Function LZOpenFileA Lib "kernel32" ( _
    ByVal lpFileName As String, _
    ByVal lpReOpenBuf As LongPtr, _
    ByVal wStyle As Integer) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

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

lib = Fiddle.dlopen('KERNEL32.dll')
LZOpenFileA = Fiddle::Function.new(
  lib['LZOpenFileA'],
  [
    Fiddle::TYPE_VOIDP,  # lpFileName : LPSTR
    Fiddle::TYPE_VOIDP,  # lpReOpenBuf : OFSTRUCT* in/out
    -Fiddle::TYPE_SHORT,  # wStyle : LZOPENFILE_STYLE
  ],
  Fiddle::TYPE_INT)
#[link(name = "kernel32")]
extern "system" {
    fn LZOpenFileA(
        lpFileName: *mut u8,  // LPSTR
        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.Ansi)]
public static extern int LZOpenFileA([MarshalAs(UnmanagedType.LPStr)] string lpFileName, IntPtr lpReOpenBuf, ushort wStyle);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_LZOpenFileA' -Namespace Win32 -PassThru
# $api::LZOpenFileA(lpFileName, lpReOpenBuf, wStyle)
#uselib "KERNEL32.dll"
#func global LZOpenFileA "LZOpenFileA" sptr, sptr, sptr
; LZOpenFileA lpFileName, varptr(lpReOpenBuf), wStyle   ; 戻り値は stat
; lpFileName : LPSTR -> "sptr"
; lpReOpenBuf : OFSTRUCT* in/out -> "sptr"
; wStyle : LZOPENFILE_STYLE -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global LZOpenFileA "LZOpenFileA" str, var, int
; res = LZOpenFileA(lpFileName, lpReOpenBuf, wStyle)
; lpFileName : LPSTR -> "str"
; lpReOpenBuf : OFSTRUCT* in/out -> "var"
; wStyle : LZOPENFILE_STYLE -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT LZOpenFileA(LPSTR lpFileName, OFSTRUCT* lpReOpenBuf, LZOPENFILE_STYLE wStyle)
#uselib "KERNEL32.dll"
#cfunc global LZOpenFileA "LZOpenFileA" str, var, int
; res = LZOpenFileA(lpFileName, lpReOpenBuf, wStyle)
; lpFileName : LPSTR -> "str"
; lpReOpenBuf : OFSTRUCT* in/out -> "var"
; wStyle : LZOPENFILE_STYLE -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procLZOpenFileA = kernel32.NewProc("LZOpenFileA")
)

// lpFileName (LPSTR), lpReOpenBuf (OFSTRUCT* in/out), wStyle (LZOPENFILE_STYLE)
r1, _, err := procLZOpenFileA.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(lpFileName))),
	uintptr(lpReOpenBuf),
	uintptr(wStyle),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function LZOpenFileA(
  lpFileName: PAnsiChar;   // LPSTR
  lpReOpenBuf: Pointer;   // OFSTRUCT* in/out
  wStyle: Word   // LZOPENFILE_STYLE
): Integer; stdcall;
  external 'KERNEL32.dll' name 'LZOpenFileA';
result := DllCall("KERNEL32\LZOpenFileA"
    , "AStr", lpFileName   ; LPSTR
    , "Ptr", lpReOpenBuf   ; OFSTRUCT* in/out
    , "UShort", wStyle   ; LZOPENFILE_STYLE
    , "Int")   ; return: INT
●LZOpenFileA(lpFileName, lpReOpenBuf, wStyle) = DLL("KERNEL32.dll", "int LZOpenFileA(char*, void*, int)")
# 呼び出し: LZOpenFileA(lpFileName, lpReOpenBuf, wStyle)
# lpFileName : LPSTR -> "char*"
# lpReOpenBuf : OFSTRUCT* in/out -> "void*"
# wStyle : LZOPENFILE_STYLE -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn LZOpenFileA(
    lpFileName: [*c]const u8, // LPSTR
    lpReOpenBuf: [*c]OFSTRUCT, // OFSTRUCT* in/out
    wStyle: u16 // LZOPENFILE_STYLE
) callconv(std.os.windows.WINAPI) i32;
proc LZOpenFileA(
    lpFileName: cstring,  # LPSTR
    lpReOpenBuf: ptr OFSTRUCT,  # OFSTRUCT* in/out
    wStyle: uint16  # LZOPENFILE_STYLE
): int32 {.importc: "LZOpenFileA", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
int LZOpenFileA(
    const(char)* lpFileName,   // LPSTR
    OFSTRUCT* lpReOpenBuf,   // OFSTRUCT* in/out
    ushort wStyle   // LZOPENFILE_STYLE
);
ccall((:LZOpenFileA, "KERNEL32.dll"), stdcall, Int32,
      (Cstring, Ptr{OFSTRUCT}, UInt16),
      lpFileName, lpReOpenBuf, wStyle)
# lpFileName : LPSTR -> Cstring
# lpReOpenBuf : OFSTRUCT* in/out -> Ptr{OFSTRUCT}
# wStyle : LZOPENFILE_STYLE -> UInt16
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t LZOpenFileA(
    const char* lpFileName,
    void* lpReOpenBuf,
    uint16_t wStyle);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.LZOpenFileA(lpFileName, lpReOpenBuf, wStyle)
-- lpFileName : LPSTR
-- lpReOpenBuf : OFSTRUCT* in/out
-- wStyle : LZOPENFILE_STYLE
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const LZOpenFileA = lib.func('__stdcall', 'LZOpenFileA', 'int32_t', ['str', 'void *', 'uint16_t']);
// LZOpenFileA(lpFileName, lpReOpenBuf, wStyle)
// lpFileName : LPSTR -> 'str'
// lpReOpenBuf : OFSTRUCT* in/out -> 'void *'
// wStyle : LZOPENFILE_STYLE -> 'uint16_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  LZOpenFileA: { parameters: ["buffer", "pointer", "u16"], result: "i32" },
});
// lib.symbols.LZOpenFileA(lpFileName, lpReOpenBuf, wStyle)
// lpFileName : LPSTR -> "buffer"
// lpReOpenBuf : OFSTRUCT* in/out -> "pointer"
// wStyle : LZOPENFILE_STYLE -> "u16"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t LZOpenFileA(
    const char* lpFileName,
    void* lpReOpenBuf,
    uint16_t wStyle);
C, "KERNEL32.dll");
// $ffi->LZOpenFileA(lpFileName, lpReOpenBuf, wStyle);
// lpFileName : LPSTR
// 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.ASCII_OPTIONS);
    int LZOpenFileA(
        String lpFileName,   // LPSTR
        Pointer lpReOpenBuf,   // OFSTRUCT* in/out
        short wStyle   // LZOPENFILE_STYLE
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun LZOpenFileA = LZOpenFileA(
    lpFileName : UInt8*,   # LPSTR
    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 LZOpenFileANative = Int32 Function(Pointer<Utf8>, Pointer<Void>, Uint16);
typedef LZOpenFileADart = int Function(Pointer<Utf8>, Pointer<Void>, int);
final LZOpenFileA = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<LZOpenFileANative, LZOpenFileADart>('LZOpenFileA');
// lpFileName : LPSTR -> Pointer<Utf8>
// lpReOpenBuf : OFSTRUCT* in/out -> Pointer<Void>
// wStyle : LZOPENFILE_STYLE -> Uint16
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function LZOpenFileA(
  lpFileName: PAnsiChar;   // LPSTR
  lpReOpenBuf: Pointer;   // OFSTRUCT* in/out
  wStyle: Word   // LZOPENFILE_STYLE
): Integer; stdcall;
  external 'KERNEL32.dll' name 'LZOpenFileA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

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

let lzopenfilea =
  foreign "LZOpenFileA"
    (string @-> (ptr void) @-> uint16_t @-> returning int32_t)
(* lpFileName : LPSTR -> string *)
(* 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 ("LZOpenFileA" lzopen-file-a :convention :stdcall) :int32
  (lp-file-name :string)   ; LPSTR
  (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 $LZOpenFileA = Win32::API::More->new('KERNEL32',
    'int LZOpenFileA(LPCSTR lpFileName, LPVOID lpReOpenBuf, WORD wStyle)');
# my $ret = $LZOpenFileA->Call($lpFileName, $lpReOpenBuf, $wStyle);
# lpFileName : LPSTR -> LPCSTR
# lpReOpenBuf : OFSTRUCT* in/out -> LPVOID
# wStyle : LZOPENFILE_STYLE -> WORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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