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

LockFileEx

関数
ファイルの指定範囲を共有または排他ロックする。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// KERNEL32.dll
#include <windows.h>

BOOL LockFileEx(
    HANDLE hFile,
    LOCK_FILE_FLAGS dwFlags,
    DWORD dwReserved,   // optional
    DWORD nNumberOfBytesToLockLow,
    DWORD nNumberOfBytesToLockHigh,
    OVERLAPPED* lpOverlapped
);

パラメーター

名前方向説明
hFileHANDLEinファイルへのハンドル。このハンドルは GENERIC_READ または GENERIC_WRITE アクセス権のいずれかで作成されている必要があります。詳細については、 File Security and Access Rights を参照してください。
dwFlagsLOCK_FILE_FLAGSin

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

意味
LOCKFILE_EXCLUSIVE_LOCK
0x00000002
関数は排他ロックを要求します。指定しない場合は共有ロックを要求します。
LOCKFILE_FAIL_IMMEDIATELY
0x00000001
要求したロックを取得できない場合、関数はただちに復帰します。指定しない場合は待機します。
dwReservedDWORDoptional予約済みのパラメーター。0 を設定する必要があります。
nNumberOfBytesToLockLowDWORDinロックするバイト範囲の長さの下位 32 ビット。
nNumberOfBytesToLockHighDWORDinロックするバイト範囲の長さの上位 32 ビット。
lpOverlappedOVERLAPPED*inoutロック要求で関数が使用する OVERLAPPED 構造体へのポインター。この構造体は必須であり、ロック範囲の先頭のファイルオフセットを格納します。hEvent メンバーは、有効なハンドルまたは 0 で初期化する必要があります。

戻り値の型: BOOL

公式ドキュメント

指定したファイルを、呼び出し元プロセスによる排他アクセス用にロックします。この関数は同期的にも非同期的にも動作でき、排他ロックまたは共有ロックのいずれかを要求できます。

戻り値

関数が成功した場合、戻り値は 0 以外(TRUE)になります。

関数が失敗した場合、戻り値は 0(FALSE)になります。拡張エラー情報を取得するには、 GetLastError を呼び出します。

解説(Remarks)

ファイルの領域をロックすることで、このファイルハンドルを使用して指定した領域への共有アクセスまたは排他アクセスを取得します。ロックを行ったプロセスが作成した子プロセスにこのファイルハンドルが継承された場合でも、子プロセスにはロックされた領域へのアクセスは許可されません。ロックを行ったプロセスが同じファイルを 2 回目に開いた場合、領域のロックを解除するまで、その 2 つ目のハンドルを通じて指定した領域にアクセスすることはできません。

ファイルの一部を排他アクセス用にロックすると、他のすべてのプロセスに対して、そのファイルの指定領域への読み取りアクセスと書き込みアクセスの両方が拒否されます。現在のファイル終端位置を超える領域をロックしてもエラーにはなりません。

ファイルの一部を共有アクセス用にロックすると、最初に領域をロックしたプロセスを含むすべてのプロセスに対して、そのファイルの指定領域への書き込みアクセスが拒否されます。すべてのプロセスはロックされた領域を読み取ることができます。

ファイルの領域をロックしても、マップされたファイルビューからの読み取りや書き込みは妨げられません。

LockFileEx 関数は、ファイルハンドルが非同期 I/O 用に開かれている場合、非同期的に動作します。ただし、LOCKFILE_FAIL_IMMEDIATELY フラグが指定されている場合を除きます。すでに共有ロックまたは排他ロックが設定されているファイル範囲に対して排他ロックが要求された場合、関数はエラー ERROR_IO_PENDING を返します。システムは、ロックが許可された後に OVERLAPPED 構造体で指定されたイベントをシグナル状態にします。ロックがいつ許可されたかを判定するには、 GetOverlappedResult 関数または 待機関数 のいずれかを使用します。詳細については、Synchronous and Asynchronous I/O を参照してください。

ファイルハンドルが非同期 I/O 用に開かれておらず、ロックが利用できない場合、LOCKFILE_FAIL_IMMEDIATELY フラグが指定されていない限り、この呼び出しはロックが許可されるかエラーが発生するまで待機します。

排他ロックは、ファイルの既存のロック領域と重なることはできません。共有ロックは、その領域に対して保持されているロックが共有ロックである場合に限り、ロック領域と重ねることができます。両方のロックが同じファイルハンドルを使用して作成された場合、共有ロックは排他ロックと重なることができます。共有ロックが排他ロックと重なる場合、可能なアクセスはそれらのロックの所有者による読み取りのみです。 同じ範囲が排他ロックと共有ロックでロックされている場合、その領域のロックを解除するには 2 回のロック解除操作が必要です。1 回目のロック解除操作で排他ロックが解除され、2 回目のロック解除操作で共有ロックが解除されます。

プロセスがファイルの一部をロックしたまま終了した場合、または未解除のロックがあるファイルを閉じた場合、それらのロックはオペレーティングシステムによって解除されます。ただし、オペレーティングシステムがこれらのロックを解除するのに要する時間は、利用可能なシステムリソースに依存します。そのため、プロセスは終了時に、ロックしたすべてのファイルを明示的にロック解除することをお勧めします。これを行わないと、オペレーティングシステムがまだロックを解除していない場合、これらのファイルへのアクセスが拒否される可能性があります。

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

テクノロジー サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) はい
SMB 3.0 スケールアウトファイル共有 (SO) はい
クラスターの共有ボリュームファイルシステム (CsvFS) はい
回復性ファイルシステム (ReFS) はい
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll
#include <windows.h>

BOOL LockFileEx(
    HANDLE hFile,
    LOCK_FILE_FLAGS dwFlags,
    DWORD dwReserved,   // optional
    DWORD nNumberOfBytesToLockLow,
    DWORD nNumberOfBytesToLockHigh,
    OVERLAPPED* lpOverlapped
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool LockFileEx(
    IntPtr hFile,   // HANDLE
    uint dwFlags,   // LOCK_FILE_FLAGS
    uint dwReserved,   // DWORD optional
    uint nNumberOfBytesToLockLow,   // DWORD
    uint nNumberOfBytesToLockHigh,   // DWORD
    IntPtr lpOverlapped   // OVERLAPPED* in/out
);
<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function LockFileEx(
    hFile As IntPtr,   ' HANDLE
    dwFlags As UInteger,   ' LOCK_FILE_FLAGS
    dwReserved As UInteger,   ' DWORD optional
    nNumberOfBytesToLockLow As UInteger,   ' DWORD
    nNumberOfBytesToLockHigh As UInteger,   ' DWORD
    lpOverlapped As IntPtr   ' OVERLAPPED* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' hFile : HANDLE
' dwFlags : LOCK_FILE_FLAGS
' dwReserved : DWORD optional
' nNumberOfBytesToLockLow : DWORD
' nNumberOfBytesToLockHigh : DWORD
' lpOverlapped : OVERLAPPED* in/out
Declare PtrSafe Function LockFileEx Lib "kernel32" ( _
    ByVal hFile As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal dwReserved As Long, _
    ByVal nNumberOfBytesToLockLow As Long, _
    ByVal nNumberOfBytesToLockHigh As Long, _
    ByVal lpOverlapped As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

LockFileEx = ctypes.windll.kernel32.LockFileEx
LockFileEx.restype = wintypes.BOOL
LockFileEx.argtypes = [
    wintypes.HANDLE,  # hFile : HANDLE
    wintypes.DWORD,  # dwFlags : LOCK_FILE_FLAGS
    wintypes.DWORD,  # dwReserved : DWORD optional
    wintypes.DWORD,  # nNumberOfBytesToLockLow : DWORD
    wintypes.DWORD,  # nNumberOfBytesToLockHigh : DWORD
    ctypes.c_void_p,  # lpOverlapped : OVERLAPPED* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
LockFileEx = Fiddle::Function.new(
  lib['LockFileEx'],
  [
    Fiddle::TYPE_VOIDP,  # hFile : HANDLE
    -Fiddle::TYPE_INT,  # dwFlags : LOCK_FILE_FLAGS
    -Fiddle::TYPE_INT,  # dwReserved : DWORD optional
    -Fiddle::TYPE_INT,  # nNumberOfBytesToLockLow : DWORD
    -Fiddle::TYPE_INT,  # nNumberOfBytesToLockHigh : DWORD
    Fiddle::TYPE_VOIDP,  # lpOverlapped : OVERLAPPED* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "kernel32")]
extern "system" {
    fn LockFileEx(
        hFile: *mut core::ffi::c_void,  // HANDLE
        dwFlags: u32,  // LOCK_FILE_FLAGS
        dwReserved: u32,  // DWORD optional
        nNumberOfBytesToLockLow: u32,  // DWORD
        nNumberOfBytesToLockHigh: u32,  // DWORD
        lpOverlapped: *mut OVERLAPPED  // OVERLAPPED* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern bool LockFileEx(IntPtr hFile, uint dwFlags, uint dwReserved, uint nNumberOfBytesToLockLow, uint nNumberOfBytesToLockHigh, IntPtr lpOverlapped);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_LockFileEx' -Namespace Win32 -PassThru
# $api::LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
#uselib "KERNEL32.dll"
#func global LockFileEx "LockFileEx" sptr, sptr, sptr, sptr, sptr, sptr
; LockFileEx hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, varptr(lpOverlapped)   ; 戻り値は stat
; hFile : HANDLE -> "sptr"
; dwFlags : LOCK_FILE_FLAGS -> "sptr"
; dwReserved : DWORD optional -> "sptr"
; nNumberOfBytesToLockLow : DWORD -> "sptr"
; nNumberOfBytesToLockHigh : DWORD -> "sptr"
; lpOverlapped : OVERLAPPED* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global LockFileEx "LockFileEx" sptr, int, int, int, int, var
; res = LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
; hFile : HANDLE -> "sptr"
; dwFlags : LOCK_FILE_FLAGS -> "int"
; dwReserved : DWORD optional -> "int"
; nNumberOfBytesToLockLow : DWORD -> "int"
; nNumberOfBytesToLockHigh : DWORD -> "int"
; lpOverlapped : OVERLAPPED* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL LockFileEx(HANDLE hFile, LOCK_FILE_FLAGS dwFlags, DWORD dwReserved, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, OVERLAPPED* lpOverlapped)
#uselib "KERNEL32.dll"
#cfunc global LockFileEx "LockFileEx" intptr, int, int, int, int, var
; res = LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
; hFile : HANDLE -> "intptr"
; dwFlags : LOCK_FILE_FLAGS -> "int"
; dwReserved : DWORD optional -> "int"
; nNumberOfBytesToLockLow : DWORD -> "int"
; nNumberOfBytesToLockHigh : DWORD -> "int"
; lpOverlapped : OVERLAPPED* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procLockFileEx = kernel32.NewProc("LockFileEx")
)

// hFile (HANDLE), dwFlags (LOCK_FILE_FLAGS), dwReserved (DWORD optional), nNumberOfBytesToLockLow (DWORD), nNumberOfBytesToLockHigh (DWORD), lpOverlapped (OVERLAPPED* in/out)
r1, _, err := procLockFileEx.Call(
	uintptr(hFile),
	uintptr(dwFlags),
	uintptr(dwReserved),
	uintptr(nNumberOfBytesToLockLow),
	uintptr(nNumberOfBytesToLockHigh),
	uintptr(lpOverlapped),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function LockFileEx(
  hFile: THandle;   // HANDLE
  dwFlags: DWORD;   // LOCK_FILE_FLAGS
  dwReserved: DWORD;   // DWORD optional
  nNumberOfBytesToLockLow: DWORD;   // DWORD
  nNumberOfBytesToLockHigh: DWORD;   // DWORD
  lpOverlapped: Pointer   // OVERLAPPED* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'LockFileEx';
result := DllCall("KERNEL32\LockFileEx"
    , "Ptr", hFile   ; HANDLE
    , "UInt", dwFlags   ; LOCK_FILE_FLAGS
    , "UInt", dwReserved   ; DWORD optional
    , "UInt", nNumberOfBytesToLockLow   ; DWORD
    , "UInt", nNumberOfBytesToLockHigh   ; DWORD
    , "Ptr", lpOverlapped   ; OVERLAPPED* in/out
    , "Int")   ; return: BOOL
●LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped) = DLL("KERNEL32.dll", "bool LockFileEx(void*, dword, dword, dword, dword, void*)")
# 呼び出し: LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
# hFile : HANDLE -> "void*"
# dwFlags : LOCK_FILE_FLAGS -> "dword"
# dwReserved : DWORD optional -> "dword"
# nNumberOfBytesToLockLow : DWORD -> "dword"
# nNumberOfBytesToLockHigh : DWORD -> "dword"
# lpOverlapped : OVERLAPPED* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn LockFileEx(
    hFile: ?*anyopaque, // HANDLE
    dwFlags: u32, // LOCK_FILE_FLAGS
    dwReserved: u32, // DWORD optional
    nNumberOfBytesToLockLow: u32, // DWORD
    nNumberOfBytesToLockHigh: u32, // DWORD
    lpOverlapped: [*c]OVERLAPPED // OVERLAPPED* in/out
) callconv(std.os.windows.WINAPI) i32;
proc LockFileEx(
    hFile: pointer,  # HANDLE
    dwFlags: uint32,  # LOCK_FILE_FLAGS
    dwReserved: uint32,  # DWORD optional
    nNumberOfBytesToLockLow: uint32,  # DWORD
    nNumberOfBytesToLockHigh: uint32,  # DWORD
    lpOverlapped: ptr OVERLAPPED  # OVERLAPPED* in/out
): int32 {.importc: "LockFileEx", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
int LockFileEx(
    void* hFile,   // HANDLE
    uint dwFlags,   // LOCK_FILE_FLAGS
    uint dwReserved,   // DWORD optional
    uint nNumberOfBytesToLockLow,   // DWORD
    uint nNumberOfBytesToLockHigh,   // DWORD
    OVERLAPPED* lpOverlapped   // OVERLAPPED* in/out
);
ccall((:LockFileEx, "KERNEL32.dll"), stdcall, Int32,
      (Ptr{Cvoid}, UInt32, UInt32, UInt32, UInt32, Ptr{OVERLAPPED}),
      hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
# hFile : HANDLE -> Ptr{Cvoid}
# dwFlags : LOCK_FILE_FLAGS -> UInt32
# dwReserved : DWORD optional -> UInt32
# nNumberOfBytesToLockLow : DWORD -> UInt32
# nNumberOfBytesToLockHigh : DWORD -> UInt32
# lpOverlapped : OVERLAPPED* in/out -> Ptr{OVERLAPPED}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t LockFileEx(
    void* hFile,
    uint32_t dwFlags,
    uint32_t dwReserved,
    uint32_t nNumberOfBytesToLockLow,
    uint32_t nNumberOfBytesToLockHigh,
    void* lpOverlapped);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
-- hFile : HANDLE
-- dwFlags : LOCK_FILE_FLAGS
-- dwReserved : DWORD optional
-- nNumberOfBytesToLockLow : DWORD
-- nNumberOfBytesToLockHigh : DWORD
-- lpOverlapped : OVERLAPPED* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const LockFileEx = lib.func('__stdcall', 'LockFileEx', 'int32_t', ['void *', 'uint32_t', 'uint32_t', 'uint32_t', 'uint32_t', 'void *']);
// LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
// hFile : HANDLE -> 'void *'
// dwFlags : LOCK_FILE_FLAGS -> 'uint32_t'
// dwReserved : DWORD optional -> 'uint32_t'
// nNumberOfBytesToLockLow : DWORD -> 'uint32_t'
// nNumberOfBytesToLockHigh : DWORD -> 'uint32_t'
// lpOverlapped : OVERLAPPED* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  LockFileEx: { parameters: ["pointer", "u32", "u32", "u32", "u32", "pointer"], result: "i32" },
});
// lib.symbols.LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped)
// hFile : HANDLE -> "pointer"
// dwFlags : LOCK_FILE_FLAGS -> "u32"
// dwReserved : DWORD optional -> "u32"
// nNumberOfBytesToLockLow : DWORD -> "u32"
// nNumberOfBytesToLockHigh : DWORD -> "u32"
// lpOverlapped : OVERLAPPED* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t LockFileEx(
    void* hFile,
    uint32_t dwFlags,
    uint32_t dwReserved,
    uint32_t nNumberOfBytesToLockLow,
    uint32_t nNumberOfBytesToLockHigh,
    void* lpOverlapped);
C, "KERNEL32.dll");
// $ffi->LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, lpOverlapped);
// hFile : HANDLE
// dwFlags : LOCK_FILE_FLAGS
// dwReserved : DWORD optional
// nNumberOfBytesToLockLow : DWORD
// nNumberOfBytesToLockHigh : DWORD
// lpOverlapped : OVERLAPPED* 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 Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
    boolean LockFileEx(
        Pointer hFile,   // HANDLE
        int dwFlags,   // LOCK_FILE_FLAGS
        int dwReserved,   // DWORD optional
        int nNumberOfBytesToLockLow,   // DWORD
        int nNumberOfBytesToLockHigh,   // DWORD
        Pointer lpOverlapped   // OVERLAPPED* in/out
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun LockFileEx = LockFileEx(
    hFile : Void*,   # HANDLE
    dwFlags : UInt32,   # LOCK_FILE_FLAGS
    dwReserved : UInt32,   # DWORD optional
    nNumberOfBytesToLockLow : UInt32,   # DWORD
    nNumberOfBytesToLockHigh : UInt32,   # DWORD
    lpOverlapped : OVERLAPPED*   # OVERLAPPED* in/out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef LockFileExNative = Int32 Function(Pointer<Void>, Uint32, Uint32, Uint32, Uint32, Pointer<Void>);
typedef LockFileExDart = int Function(Pointer<Void>, int, int, int, int, Pointer<Void>);
final LockFileEx = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<LockFileExNative, LockFileExDart>('LockFileEx');
// hFile : HANDLE -> Pointer<Void>
// dwFlags : LOCK_FILE_FLAGS -> Uint32
// dwReserved : DWORD optional -> Uint32
// nNumberOfBytesToLockLow : DWORD -> Uint32
// nNumberOfBytesToLockHigh : DWORD -> Uint32
// lpOverlapped : OVERLAPPED* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function LockFileEx(
  hFile: THandle;   // HANDLE
  dwFlags: DWORD;   // LOCK_FILE_FLAGS
  dwReserved: DWORD;   // DWORD optional
  nNumberOfBytesToLockLow: DWORD;   // DWORD
  nNumberOfBytesToLockHigh: DWORD;   // DWORD
  lpOverlapped: Pointer   // OVERLAPPED* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'LockFileEx';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "LockFileEx"
  c_LockFileEx :: Ptr () -> Word32 -> Word32 -> Word32 -> Word32 -> Ptr () -> IO CInt
-- hFile : HANDLE -> Ptr ()
-- dwFlags : LOCK_FILE_FLAGS -> Word32
-- dwReserved : DWORD optional -> Word32
-- nNumberOfBytesToLockLow : DWORD -> Word32
-- nNumberOfBytesToLockHigh : DWORD -> Word32
-- lpOverlapped : OVERLAPPED* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let lockfileex =
  foreign "LockFileEx"
    ((ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> uint32_t @-> (ptr void) @-> returning int32_t)
(* hFile : HANDLE -> (ptr void) *)
(* dwFlags : LOCK_FILE_FLAGS -> uint32_t *)
(* dwReserved : DWORD optional -> uint32_t *)
(* nNumberOfBytesToLockLow : DWORD -> uint32_t *)
(* nNumberOfBytesToLockHigh : DWORD -> uint32_t *)
(* lpOverlapped : OVERLAPPED* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("LockFileEx" lock-file-ex :convention :stdcall) :int32
  (h-file :pointer)   ; HANDLE
  (dw-flags :uint32)   ; LOCK_FILE_FLAGS
  (dw-reserved :uint32)   ; DWORD optional
  (n-number-of-bytes-to-lock-low :uint32)   ; DWORD
  (n-number-of-bytes-to-lock-high :uint32)   ; DWORD
  (lp-overlapped :pointer))   ; OVERLAPPED* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $LockFileEx = Win32::API::More->new('KERNEL32',
    'BOOL LockFileEx(HANDLE hFile, DWORD dwFlags, DWORD dwReserved, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, LPVOID lpOverlapped)');
# my $ret = $LockFileEx->Call($hFile, $dwFlags, $dwReserved, $nNumberOfBytesToLockLow, $nNumberOfBytesToLockHigh, $lpOverlapped);
# hFile : HANDLE -> HANDLE
# dwFlags : LOCK_FILE_FLAGS -> DWORD
# dwReserved : DWORD optional -> DWORD
# nNumberOfBytesToLockLow : DWORD -> DWORD
# nNumberOfBytesToLockHigh : DWORD -> DWORD
# lpOverlapped : OVERLAPPED* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
公式の関連項目
使用する型