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

CF_PLACEHOLDER_CREATE_INFO

構造体
サイズx64: 88 バイト / x86: 80 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
RelativeFileNameLPWSTR8/4+0+0同期ルートからの相対ファイル名文字列。
FsMetadataCF_FS_METADATA48+8+8プレースホルダーに設定するファイルシステムメタデータ。
FileIdentityvoid*8/4+56+56プロバイダー固有のファイル識別データへのポインタ。
FileIdentityLengthDWORD4+64+60FileIdentityのバイト長を表す。
FlagsCF_PLACEHOLDER_CREATE_FLAGS4+68+64プレースホルダー作成時の挙動を制御するフラグ群。
ResultHRESULT4+72+68作成処理の結果HRESULT。出力値。
CreateUsnLONGLONG8+80+72作成後に割り当てられたUSN(更新シーケンス番号)。出力値。

各言語での定義

#include <windows.h>

// FILE_BASIC_INFO  (x64 40 / x86 40 バイト)
typedef struct FILE_BASIC_INFO {
    LONGLONG CreationTime;
    LONGLONG LastAccessTime;
    LONGLONG LastWriteTime;
    LONGLONG ChangeTime;
    DWORD FileAttributes;
} FILE_BASIC_INFO;

// CF_FS_METADATA  (x64 48 / x86 48 バイト)
typedef struct CF_FS_METADATA {
    FILE_BASIC_INFO BasicInfo;
    LONGLONG FileSize;
} CF_FS_METADATA;

// CF_PLACEHOLDER_CREATE_INFO  (x64 88 / x86 80 バイト)
typedef struct CF_PLACEHOLDER_CREATE_INFO {
    LPWSTR RelativeFileName;
    CF_FS_METADATA FsMetadata;
    void* FileIdentity;
    DWORD FileIdentityLength;
    CF_PLACEHOLDER_CREATE_FLAGS Flags;
    HRESULT Result;
    LONGLONG CreateUsn;
} CF_PLACEHOLDER_CREATE_INFO;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FILE_BASIC_INFO
{
    public long CreationTime;
    public long LastAccessTime;
    public long LastWriteTime;
    public long ChangeTime;
    public uint FileAttributes;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CF_FS_METADATA
{
    public FILE_BASIC_INFO BasicInfo;
    public long FileSize;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CF_PLACEHOLDER_CREATE_INFO
{
    public IntPtr RelativeFileName;
    public CF_FS_METADATA FsMetadata;
    public IntPtr FileIdentity;
    public uint FileIdentityLength;
    public int Flags;
    public int Result;
    public long CreateUsn;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FILE_BASIC_INFO
    Public CreationTime As Long
    Public LastAccessTime As Long
    Public LastWriteTime As Long
    Public ChangeTime As Long
    Public FileAttributes As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CF_FS_METADATA
    Public BasicInfo As FILE_BASIC_INFO
    Public FileSize As Long
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CF_PLACEHOLDER_CREATE_INFO
    Public RelativeFileName As IntPtr
    Public FsMetadata As CF_FS_METADATA
    Public FileIdentity As IntPtr
    Public FileIdentityLength As UInteger
    Public Flags As Integer
    Public Result As Integer
    Public CreateUsn As Long
End Structure
import ctypes
from ctypes import wintypes

class FILE_BASIC_INFO(ctypes.Structure):
    _fields_ = [
        ("CreationTime", ctypes.c_longlong),
        ("LastAccessTime", ctypes.c_longlong),
        ("LastWriteTime", ctypes.c_longlong),
        ("ChangeTime", ctypes.c_longlong),
        ("FileAttributes", wintypes.DWORD),
    ]

class CF_FS_METADATA(ctypes.Structure):
    _fields_ = [
        ("BasicInfo", FILE_BASIC_INFO),
        ("FileSize", ctypes.c_longlong),
    ]

class CF_PLACEHOLDER_CREATE_INFO(ctypes.Structure):
    _fields_ = [
        ("RelativeFileName", ctypes.c_void_p),
        ("FsMetadata", CF_FS_METADATA),
        ("FileIdentity", ctypes.c_void_p),
        ("FileIdentityLength", wintypes.DWORD),
        ("Flags", ctypes.c_int),
        ("Result", ctypes.c_int),
        ("CreateUsn", ctypes.c_longlong),
    ]
#[repr(C)]
pub struct FILE_BASIC_INFO {
    pub CreationTime: i64,
    pub LastAccessTime: i64,
    pub LastWriteTime: i64,
    pub ChangeTime: i64,
    pub FileAttributes: u32,
}

#[repr(C)]
pub struct CF_FS_METADATA {
    pub BasicInfo: FILE_BASIC_INFO,
    pub FileSize: i64,
}

#[repr(C)]
pub struct CF_PLACEHOLDER_CREATE_INFO {
    pub RelativeFileName: *mut core::ffi::c_void,
    pub FsMetadata: CF_FS_METADATA,
    pub FileIdentity: *mut core::ffi::c_void,
    pub FileIdentityLength: u32,
    pub Flags: i32,
    pub Result: i32,
    pub CreateUsn: i64,
}
import "golang.org/x/sys/windows"

type FILE_BASIC_INFO struct {
	CreationTime int64
	LastAccessTime int64
	LastWriteTime int64
	ChangeTime int64
	FileAttributes uint32
}

type CF_FS_METADATA struct {
	BasicInfo FILE_BASIC_INFO
	FileSize int64
}

type CF_PLACEHOLDER_CREATE_INFO struct {
	RelativeFileName uintptr
	FsMetadata CF_FS_METADATA
	FileIdentity uintptr
	FileIdentityLength uint32
	Flags int32
	Result int32
	CreateUsn int64
}
type
  FILE_BASIC_INFO = record
    CreationTime: Int64;
    LastAccessTime: Int64;
    LastWriteTime: Int64;
    ChangeTime: Int64;
    FileAttributes: DWORD;
  end;

  CF_FS_METADATA = record
    BasicInfo: FILE_BASIC_INFO;
    FileSize: Int64;
  end;

  CF_PLACEHOLDER_CREATE_INFO = record
    RelativeFileName: Pointer;
    FsMetadata: CF_FS_METADATA;
    FileIdentity: Pointer;
    FileIdentityLength: DWORD;
    Flags: Integer;
    Result: Integer;
    CreateUsn: Int64;
  end;
const FILE_BASIC_INFO = extern struct {
    CreationTime: i64,
    LastAccessTime: i64,
    LastWriteTime: i64,
    ChangeTime: i64,
    FileAttributes: u32,
};

const CF_FS_METADATA = extern struct {
    BasicInfo: FILE_BASIC_INFO,
    FileSize: i64,
};

const CF_PLACEHOLDER_CREATE_INFO = extern struct {
    RelativeFileName: ?*anyopaque,
    FsMetadata: CF_FS_METADATA,
    FileIdentity: ?*anyopaque,
    FileIdentityLength: u32,
    Flags: i32,
    Result: i32,
    CreateUsn: i64,
};
type
  FILE_BASIC_INFO {.bycopy.} = object
    CreationTime: int64
    LastAccessTime: int64
    LastWriteTime: int64
    ChangeTime: int64
    FileAttributes: uint32

  CF_FS_METADATA {.bycopy.} = object
    BasicInfo: FILE_BASIC_INFO
    FileSize: int64

  CF_PLACEHOLDER_CREATE_INFO {.bycopy.} = object
    RelativeFileName: pointer
    FsMetadata: CF_FS_METADATA
    FileIdentity: pointer
    FileIdentityLength: uint32
    Flags: int32
    Result: int32
    CreateUsn: int64
struct FILE_BASIC_INFO
{
    long CreationTime;
    long LastAccessTime;
    long LastWriteTime;
    long ChangeTime;
    uint FileAttributes;
}

struct CF_FS_METADATA
{
    FILE_BASIC_INFO BasicInfo;
    long FileSize;
}

struct CF_PLACEHOLDER_CREATE_INFO
{
    void* RelativeFileName;
    CF_FS_METADATA FsMetadata;
    void* FileIdentity;
    uint FileIdentityLength;
    int Flags;
    int Result;
    long CreateUsn;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CF_PLACEHOLDER_CREATE_INFO サイズ: 80 バイト(x86)
dim st, 20    ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; RelativeFileName : LPWSTR (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; FsMetadata : CF_FS_METADATA (+8, 48byte)  varptr(st)+8 を基点に操作(48byte:入れ子/配列)
; FileIdentity : void* (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; FileIdentityLength : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; Flags : CF_PLACEHOLDER_CREATE_FLAGS (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; Result : HRESULT (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; CreateUsn : LONGLONG (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CF_PLACEHOLDER_CREATE_INFO サイズ: 88 バイト(x64)
dim st, 22    ; 4byte整数×22(構造体サイズ 88 / 4 切り上げ)
; RelativeFileName : LPWSTR (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; FsMetadata : CF_FS_METADATA (+8, 48byte)  varptr(st)+8 を基点に操作(48byte:入れ子/配列)
; FileIdentity : void* (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; FileIdentityLength : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; Flags : CF_PLACEHOLDER_CREATE_FLAGS (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; Result : HRESULT (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; CreateUsn : LONGLONG (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global FILE_BASIC_INFO
    #field int64 CreationTime
    #field int64 LastAccessTime
    #field int64 LastWriteTime
    #field int64 ChangeTime
    #field int FileAttributes
#endstruct

#defstruct global CF_FS_METADATA
    #field FILE_BASIC_INFO BasicInfo
    #field int64 FileSize
#endstruct

#defstruct global CF_PLACEHOLDER_CREATE_INFO
    #field intptr RelativeFileName
    #field CF_FS_METADATA FsMetadata
    #field intptr FileIdentity
    #field int FileIdentityLength
    #field int Flags
    #field int Result
    #field int64 CreateUsn
#endstruct

stdim st, CF_PLACEHOLDER_CREATE_INFO        ; NSTRUCT 変数を確保
st->FileIdentityLength = 100
mes "FileIdentityLength=" + st->FileIdentityLength