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

MoveFileExW

関数
フラグ指定でファイルを移動・改名する(Unicode版)。
DLLKERNEL32.dll文字セットUnicode (-W)呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

BOOL MoveFileExW(
    LPCWSTR lpExistingFileName,
    LPCWSTR lpNewFileName,   // optional
    MOVE_FILE_FLAGS dwFlags
);

パラメーター

名前方向説明
lpExistingFileNameLPCWSTRin

ローカルコンピューター上のファイルまたはディレクトリの現在の名前。

dwFlagsMOVEFILE_DELAY_UNTIL_REBOOT を指定した場合、遅延操作はネットワークが利用可能になる前に実行されるため、 ファイルをリモート共有上に置くことはできません。

既定では、名前は MAX_PATH 文字に制限されます。この制限を 32,767 ワイド文字に拡張するには、パスの先頭に "\\?\" を付加します。詳細については、ファイル、パス、名前空間の名前付けを参照してください。

ヒント

Windows 10 バージョン 1607 以降では、"\\?\" を付加せずに MAX_PATH の制限を解除するオプトインが可能です。詳細については、ファイル、パス、名前空間の名前付けの「最大パス長の制限」セクションを参照してください。

lpNewFileNameLPCWSTRinoptional

ローカルコンピューター上のファイルまたはディレクトリの新しい名前。

ファイルを移動する場合、移動先は別のファイルシステムまたはボリュームでもかまいません。移動先が別のドライブにある場合は、 dwFlagsMOVEFILE_COPY_ALLOWED フラグを設定する必要があります。

ディレクトリを移動する場合、移動先は同じドライブ上になければなりません。

dwFlagsMOVEFILE_DELAY_UNTIL_REBOOT を指定し、 lpNewFileNameNULL の場合、 MoveFileExlpExistingFileName ファイルをシステムの再起動時に削除するよう登録します。 lpExistingFileName がディレクトリを指している場合、システムは再起動時にそのディレクトリが空である場合に限り削除します。

この関数の ANSI 版では、名前は MAX_PATH 文字に制限されます。 この制限を 32,767 ワイド文字に拡張するには、この関数の Unicode 版を呼び出し、パスの先頭に "\?" を付加します。詳細については、 ファイルの名前付けを参照してください。

ヒント

Windows 10 バージョン 1607 以降では、"\\?\" を付加せずに MAX_PATH の制限を解除するオプトインが可能です。詳細については、ファイル、パス、名前空間の名前付けの「最大パス長の制限」セクションを参照してください。

dwFlagsMOVE_FILE_FLAGSin

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

意味
MOVEFILE_COPY_ALLOWED
2 (0x2)
ファイルを別のボリュームに移動する場合、この関数は CopyFile および DeleteFile 関数を使用して移動をシミュレートします。

ファイルが別のボリュームに正常にコピーされたものの元のファイルを削除できなかった場合、 この関数はソースファイルをそのまま残して成功します。

この値は MOVEFILE_DELAY_UNTIL_REBOOT と併用できません。

MOVEFILE_CREATE_HARDLINK
16 (0x10)
将来の使用のために予約されています。
MOVEFILE_DELAY_UNTIL_REBOOT
4 (0x4)
システムはオペレーティングシステムが再起動されるまでファイルを移動しません。システムは AUTOCHK の実行直後、ただしページングファイルを作成する前にファイルを移動します。 したがって、このパラメーターを使用すると、以前の起動時のページングファイルを削除できます。

この値は、プロセスが Administrators グループまたは LocalSystem アカウントに属するユーザーのコンテキストにある場合にのみ使用できます。

この値は MOVEFILE_COPY_ALLOWED と併用できません。

MOVEFILE_FAIL_IF_NOT_TRACKABLE
32 (0x20)
ソースファイルがリンクソースであるものの、移動後にファイルを追跡できない場合、この関数は失敗します。 この状況は、移動先が FAT ファイルシステムでフォーマットされたボリュームである場合に発生する可能性があります。
MOVEFILE_REPLACE_EXISTING
1 (0x1)
lpNewFileName という名前のファイルが存在する場合、アクセス制御リスト (ACL) に関するセキュリティ要件が満たされていれば、 この関数はその内容を lpExistingFileName ファイルの内容で置き換えます。詳細については、本トピックの「解説」セクションを参照してください。

lpNewFileName が既存のディレクトリを指している場合、エラーが報告されます。

MOVEFILE_WRITE_THROUGH
8 (0x8)
この関数は、ファイルが実際にディスク上で移動されるまで制御を返しません。

この値を設定すると、コピーと削除の操作として実行される移動が、関数が制御を返す前にディスクにフラッシュされることが保証されます。フラッシュはコピー操作の終了時に行われます。

この値は MOVEFILE_DELAY_UNTIL_REBOOT が設定されている場合は効果がありません。

戻り値の型: BOOL

公式ドキュメント

既存のファイルまたはディレクトリを、その子要素も含めて、さまざまな移動オプションを指定して移動します。(Unicode)

戻り値

関数が成功すると、戻り値は 0 以外になります。

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

解説(Remarks)

dwFlags パラメーターに MOVEFILE_DELAY_UNTIL_REBOOT を指定した場合、 レジストリにアクセスできないと MoveFileEx は失敗します。この関数は、再起動時に名前変更されるファイルの場所を次のレジストリ値に格納します。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

このレジストリ値は REG_MULTI_SZ 型です。各名前変更操作は、その操作が削除であるかどうかに応じて、次の NULL 終端文字列のいずれか 1 つを格納します。

文字列 szSrcFile\0\0 は、ファイル szSrcFile が再起動時に削除されることを示します。 文字列 szSrcFile\0szDstFile\0 は、 szSrcFile が再起動時に szDstFile に名前変更されることを示します。
\0\0 は技術的には REG_MULTI_SZ ノードでは許可されていませんが、 ファイルが空の名前に名前変更されるものとして扱われるため、使用できます。
システムはこれらのレジストリエントリを使用して、発行されたのと同じ順序で再起動時に操作を完了します。たとえば、次のコードフラグメントは、 再起動時に szSrcFile を削除し、szSrcFileszDstFile に名前変更するレジストリエントリを作成します。
MoveFileEx(szSrcFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);

MOVEFILE_DELAY_UNTIL_REBOOT フラグで指定された実際の移動および削除操作は、呼び出し元アプリケーションの実行が終了した後に行われるため、 戻り値はファイルの移動や削除の成否を反映できません。むしろ、適切なエントリをレジストリに配置できたかどうかの成否を反映します。

システムは、MOVEFILE_DELAY_UNTIL_REBOOT フラグで削除対象としてタグ付けされたディレクトリを、それが空である場合に限り削除します。 ディレクトリの削除を確実にするには、削除を試みる前にディレクトリ内のすべてのファイルを移動または削除してください。起動時にディレクトリ内にファイルが存在していてもかまいませんが、 システムがそのディレクトリを削除できるようにするには、それらを削除または移動しておく必要があります。

移動および削除操作は、呼び出し元アプリケーションで指定されたのと同じ順序で起動時に実行されます。起動時にファイルを含むディレクトリを削除するには、まずファイルを削除してください。

ファイルがボリュームをまたいで移動される場合、MoveFileEx はセキュリティ記述子をファイルと共に移動しません。ファイルには移動先ディレクトリの既定のセキュリティ記述子が割り当てられます。

MoveFileEx 関数は、リンク追跡サービスと連携して動作するため、 リンクソースは移動されてもその追跡が可能です。

ファイルを削除または名前変更するには、そのファイルに対する削除アクセス許可、または親ディレクトリに対する子の削除アクセス許可のいずれかが必要です。削除および子の削除を除くすべてのアクセスを持つディレクトリを設定し、 新しいファイルの ACL が継承されるようにした場合、ファイルを削除できないままファイルを作成できることになります。ただし、その後ファイルを作成すると、ファイルの作成時に返されるハンドルに対して、要求したすべてのアクセスが得られます。 ファイルの作成時に削除アクセス許可を要求した場合、そのハンドルを使ってファイルを削除または名前変更できますが、他のハンドルではできません。詳細については、 ファイルのセキュリティとアクセス権を参照してください。

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

テクノロジ サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) はい
スケールアウトファイル共有 (SO) を使用した SMB 3.0 はい
クラスターの共有ボリュームファイルシステム (CsvFS) はい
回復性のあるファイルシステム (ReFS) はい

例については、 一時ファイルの作成と使用を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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>

BOOL MoveFileExW(
    LPCWSTR lpExistingFileName,
    LPCWSTR lpNewFileName,   // optional
    MOVE_FILE_FLAGS dwFlags
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern bool MoveFileExW(
    [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName,   // LPCWSTR optional
    uint dwFlags   // MOVE_FILE_FLAGS
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function MoveFileExW(
    <MarshalAs(UnmanagedType.LPWStr)> lpExistingFileName As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> lpNewFileName As String,   ' LPCWSTR optional
    dwFlags As UInteger   ' MOVE_FILE_FLAGS
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' lpExistingFileName : LPCWSTR
' lpNewFileName : LPCWSTR optional
' dwFlags : MOVE_FILE_FLAGS
Declare PtrSafe Function MoveFileExW Lib "kernel32" ( _
    ByVal lpExistingFileName As LongPtr, _
    ByVal lpNewFileName As LongPtr, _
    ByVal dwFlags 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

MoveFileExW = ctypes.windll.kernel32.MoveFileExW
MoveFileExW.restype = wintypes.BOOL
MoveFileExW.argtypes = [
    wintypes.LPCWSTR,  # lpExistingFileName : LPCWSTR
    wintypes.LPCWSTR,  # lpNewFileName : LPCWSTR optional
    wintypes.DWORD,  # dwFlags : MOVE_FILE_FLAGS
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
MoveFileExW = Fiddle::Function.new(
  lib['MoveFileExW'],
  [
    Fiddle::TYPE_VOIDP,  # lpExistingFileName : LPCWSTR
    Fiddle::TYPE_VOIDP,  # lpNewFileName : LPCWSTR optional
    -Fiddle::TYPE_INT,  # dwFlags : MOVE_FILE_FLAGS
  ],
  Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "kernel32")]
extern "system" {
    fn MoveFileExW(
        lpExistingFileName: *const u16,  // LPCWSTR
        lpNewFileName: *const u16,  // LPCWSTR optional
        dwFlags: u32  // MOVE_FILE_FLAGS
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool MoveFileExW([MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, uint dwFlags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_MoveFileExW' -Namespace Win32 -PassThru
# $api::MoveFileExW(lpExistingFileName, lpNewFileName, dwFlags)
#uselib "KERNEL32.dll"
#func global MoveFileExW "MoveFileExW" wptr, wptr, wptr
; MoveFileExW lpExistingFileName, lpNewFileName, dwFlags   ; 戻り値は stat
; lpExistingFileName : LPCWSTR -> "wptr"
; lpNewFileName : LPCWSTR optional -> "wptr"
; dwFlags : MOVE_FILE_FLAGS -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "KERNEL32.dll"
#cfunc global MoveFileExW "MoveFileExW" wstr, wstr, int
; res = MoveFileExW(lpExistingFileName, lpNewFileName, dwFlags)
; lpExistingFileName : LPCWSTR -> "wstr"
; lpNewFileName : LPCWSTR optional -> "wstr"
; dwFlags : MOVE_FILE_FLAGS -> "int"
; BOOL MoveFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, MOVE_FILE_FLAGS dwFlags)
#uselib "KERNEL32.dll"
#cfunc global MoveFileExW "MoveFileExW" wstr, wstr, int
; res = MoveFileExW(lpExistingFileName, lpNewFileName, dwFlags)
; lpExistingFileName : LPCWSTR -> "wstr"
; lpNewFileName : LPCWSTR optional -> "wstr"
; dwFlags : MOVE_FILE_FLAGS -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procMoveFileExW = kernel32.NewProc("MoveFileExW")
)

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

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

typedef MoveFileExWNative = Int32 Function(Pointer<Utf16>, Pointer<Utf16>, Uint32);
typedef MoveFileExWDart = int Function(Pointer<Utf16>, Pointer<Utf16>, int);
final MoveFileExW = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<MoveFileExWNative, MoveFileExWDart>('MoveFileExW');
// lpExistingFileName : LPCWSTR -> Pointer<Utf16>
// lpNewFileName : LPCWSTR optional -> Pointer<Utf16>
// dwFlags : MOVE_FILE_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MoveFileExW(
  lpExistingFileName: PWideChar;   // LPCWSTR
  lpNewFileName: PWideChar;   // LPCWSTR optional
  dwFlags: DWORD   // MOVE_FILE_FLAGS
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'MoveFileExW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "MoveFileExW"
  c_MoveFileExW :: CWString -> CWString -> Word32 -> IO CInt
-- lpExistingFileName : LPCWSTR -> CWString
-- lpNewFileName : LPCWSTR optional -> CWString
-- dwFlags : MOVE_FILE_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let movefileexw =
  foreign "MoveFileExW"
    ((ptr uint16_t) @-> (ptr uint16_t) @-> uint32_t @-> returning int32_t)
(* lpExistingFileName : LPCWSTR -> (ptr uint16_t) *)
(* lpNewFileName : LPCWSTR optional -> (ptr uint16_t) *)
(* dwFlags : MOVE_FILE_FLAGS -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("MoveFileExW" move-file-ex-w :convention :stdcall) :int32
  (lp-existing-file-name (:string :encoding :utf-16le))   ; LPCWSTR
  (lp-new-file-name (:string :encoding :utf-16le))   ; LPCWSTR optional
  (dw-flags :uint32))   ; MOVE_FILE_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MoveFileExW = Win32::API::More->new('KERNEL32',
    'BOOL MoveFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlags)');
# my $ret = $MoveFileExW->Call($lpExistingFileName, $lpNewFileName, $dwFlags);
# lpExistingFileName : LPCWSTR -> LPCWSTR
# lpNewFileName : LPCWSTR optional -> LPCWSTR
# dwFlags : MOVE_FILE_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

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