CreateFileTransactedA
関数シグネチャ
// KERNEL32.dll (ANSI / -A)
#include <windows.h>
HANDLE CreateFileTransactedA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
FILE_SHARE_MODE dwShareMode,
SECURITY_ATTRIBUTES* lpSecurityAttributes, // optional
FILE_CREATION_DISPOSITION dwCreationDisposition,
FILE_FLAGS_AND_ATTRIBUTES dwFlagsAndAttributes,
HANDLE hTemplateFile, // optional
HANDLE hTransaction,
TXFS_MINIVERSION* pusMiniVersion, // optional
void* lpExtendedParameter // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| lpFileName | LPCSTR | in | 作成または開くオブジェクトの名前。 オブジェクトはローカルコンピューター上に存在する必要があります。そうでない場合、 関数は失敗し、最後のエラーコードは ERROR_TRANSACTIONS_UNSUPPORTED_REMOTE に設定されます。 既定では、名前は MAX_PATH 文字に制限されています。この制限を 32,767 ワイド文字に拡張するには、パスの先頭に "\\?\" を付加します。詳細については、ファイル、パス、および名前空間の名前付けを参照してください。 ヒント
Windows 10 バージョン 1607 以降では、"\\?\" を付加せずに MAX_PATH 制限を解除するようオプトインできます。詳細については、ファイル、パス、および名前空間の名前付けの「Maximum Path Length Limitation」セクションを参照してください。 ファイルストリームを作成するには、ファイル名、コロン、続いてストリーム名を指定します。詳細については、 File Streams を参照してください。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dwDesiredAccess | DWORD | in | オブジェクトへのアクセス。読み取り、書き込み、両方、またはいずれでもない(ゼロ)に要約できます。最もよく 使用される値は GENERIC_READ、GENERIC_WRITE、またはその両方 (GENERIC_READ | GENERIC_WRITE) です。詳細については、 Generic Access Rights および File Security and Access Rights を参照してください。 このパラメーターがゼロの場合、アプリケーションはファイル、ディレクトリ、またはデバイスにアクセスせずに、それらの 属性をクエリできます。詳細については、このトピックの「解説」セクションを参照してください。 オープンハンドルを持つオープン要求で指定された共有モードと競合するアクセスモードを要求することはできません。詳細については、 Creating and Opening Files を参照してください。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dwShareMode | FILE_SHARE_MODE | in | オブジェクトの共有モード。読み取り、書き込み、両方、削除、これらすべて、またはなし(次の 表を参照)を指定できます。 このパラメーターがゼロで、 CreateFileTransacted が成功した場合、オブジェクトは 共有できず、ハンドルが閉じられるまで再び開くことはできません。詳細については、このトピックの「解説」セクション を参照してください。 オープンハンドルを持つオープン要求で指定されたアクセスモードと競合する共有モードを要求することはできません。 これは次の共有違反を引き起こすためです: ERROR_SHARING_VIOLATION。詳細については、 Creating and Opening Files を参照してください。 あるプロセスがオブジェクトを開いている間に、別のプロセスがそのオブジェクトを共有できるようにするには、次の値の 1 つ 以上を組み合わせて、オブジェクトを開くために要求できるアクセスモードを指定します。 Note 各オープンハンドルの共有オプションは、プロセスのコンテキストに関係なく、そのハンドルが閉じられるまで
有効です。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpSecurityAttributes | SECURITY_ATTRIBUTES* | inoptional | 省略可能な セキュリティ記述子を含む SECURITY_ATTRIBUTES 構造体へのポインター。返されるハンドルを子プロセスが継承できるかどうかも決定します。このパラメーターは NULL にすることができます。 lpSecurityAttributes パラメーターが NULL の場合、 CreateFileTransacted によって返されるハンドルは、アプリケーションが作成する子プロセスによって 継承できず、返されるハンドルに関連付けられたオブジェクトには既定のセキュリティ記述子が割り当てられます。 構造体の bInheritHandle メンバーは、返されるハンドルを 継承できるかどうかを指定します。 構造体の lpSecurityDescriptor メンバーは、オブジェクトの セキュリティ記述子を指定しますが、 NULL にすることもできます。 lpSecurityDescriptor メンバーが NULL の場合、返されるハンドルに関連付けられた オブジェクトには既定のセキュリティ記述子が割り当てられます。 CreateFileTransacted は、既存のファイルを開く際に lpSecurityDescriptor メンバーを無視しますが、 bInheritHandle メンバーは引き続き使用します。 詳細については、このトピックの「解説」セクションを参照してください。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dwCreationDisposition | FILE_CREATION_DISPOSITION | in | 存在するファイルおよび存在しないファイルに対して実行するアクション。 詳細については、このトピックの「解説」セクションを参照してください。 このパラメーターは、次のいずれかの値である必要があり、組み合わせることはできません。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dwFlagsAndAttributes | FILE_FLAGS_AND_ATTRIBUTES | in | ファイル属性とフラグ。FILE_ATTRIBUTE_NORMAL が最も一般的な既定 値です。 このパラメーターには、使用可能なファイル属性 (FILE_ATTRIBUTE_*) の任意の組み合わせを含めることができます。他のすべてのファイル属性は FILE_ATTRIBUTE_NORMAL をオーバーライドします。 このパラメーターには、バッファリング動作、アクセスモード、およびその他の特殊用途のフラグを制御するための フラグ (FILE_FLAG_*) の組み合わせを含めることもできます。これらは任意の FILE_ATTRIBUTE_* 値と組み合わせられます。 このパラメーターには、SECURITY_SQOS_PRESENT フラグを指定することで、Security Quality of Service (SQOS) 情報を 含めることもできます。SQOS 関連の追加フラグ情報は、属性とフラグの表の後の 表に示されています。 Note
CreateFileTransacted が既存の ファイルを開く際、通常はファイルフラグを既存ファイルのファイル属性と組み合わせ、 dwFlagsAndAttributes の一部として指定されたファイル属性は無視します。特殊なケースについては、 Creating and Opening Files で詳しく説明されています。
dwFlagsAndAttributes パラメーターは、Security Quality of Service 情報を指定することもできます。詳細については、 Impersonation Levels を参照してください。呼び出し側 アプリケーションが dwFlagsAndAttributes の一部として SECURITY_SQOS_PRESENT フラグを指定する場合、 次の値の 1 つ以上を含めることもできます。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| hTemplateFile | HANDLE | inoptional | GENERIC_READ アクセス権を持つテンプレートファイルへの有効なハンドル。テンプレート ファイルは、作成されるファイルにファイル属性と拡張属性を提供します。このパラメーターは NULL にすることができます。 既存のファイルを開く際、 CreateFileTransacted はテンプレートファイルを無視します。 新しい EFS 暗号化ファイルを開く際、ファイルは親ディレクトリから DACL を継承します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| hTransaction | HANDLE | in | トランザクションへのハンドル。このハンドルは CreateTransaction 関数によって返されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pusMiniVersion | TXFS_MINIVERSION* | inoptional | 開くミニバージョン。hTransaction で指定されたトランザクションが ファイルを変更しているトランザクションでない場合、このパラメーターは NULL にする必要があります。それ以外の場合、 このパラメーターには、 FSCTL_TXFS_CREATE_MINIVERSION 制御 コードによって返されたミニバージョン識別子、または次のいずれかの値を指定できます。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpExtendedParameter | void* | optional | このパラメーターは予約されており、NULL にする必要があります。 |
戻り値の型: HANDLE
公式ドキュメント
トランザクション操作として、ファイル、ファイルストリーム、またはディレクトリを作成または開きます。(ANSI)
戻り値
関数が成功した場合、戻り値は指定されたファイル、デバイス、名前付きパイプ、または メールスロットへのオープンハンドルです。
関数が失敗した場合、戻り値は INVALID_HANDLE_VALUE です。拡張 エラー情報を取得するには、GetLastError を呼び出します。
解説(Remarks)
CreateFileTransacted によって返されたハンドルを使用する場合は、 適切な箇所で標準のファイル I/O 関数の代わりにトランザクション版のファイル I/O 関数を使用します。詳細については、 Programming Considerations for Transactional NTFS を参照してください。
ディレクトリへのトランザクションハンドルを開く場合、そのハンドルには FILE_WRITE_DATA (FILE_ADD_FILE) および FILE_APPEND_DATA (FILE_ADD_SUBDIRECTORY) アクセス許可が必要です。これらは FILE_GENERIC_WRITE アクセス許可に含まれています。ハンドルを使ってファイルまたはサブディレクトリを 作成するだけの場合は、より少ないアクセス許可でディレクトリを開くべきです。そうしないと、共有違反が 発生する可能性があります。
ファイルが別のトランザクションの一部である場合(つまり、別のアプリケーションが CreateFileTransacted を呼び出してそれを開いた場合)、そのファイルを FILE_EXECUTE アクセスレベルで開くことはできません。これは、アクセスレベル FILE_EXECUTE または FILE_ALL_ACCESS が指定されている場合、 CreateFileTransacted が失敗することを意味します。
非トランザクションアプリケーションが lpSecurityAttributes に MAXIMUM_ALLOWED を指定して CreateFileTransacted を呼び出すと、毎回同じアクセスレベルでハンドルが 開かれます。トランザクションアプリケーションが lpSecurityAttributes に MAXIMUM_ALLOWED を指定して CreateFileTransacted を呼び出すと、ファイルがトランザクションによってロックされているかどうかに基づいて 異なるアクセス量でハンドルが開かれます。たとえば、 呼び出し側アプリケーションがファイルに対して FILE_EXECUTE アクセスレベルを持っている場合、開かれるファイルが トランザクションによってロックされていないか、トランザクションによってロックされていてアプリケーションがすでにそのファイルの トランザクション読み取り側である場合にのみ、このアクセスが取得されます。
トランザクション操作の完全な説明については、Transactional NTFS を 参照してください。
CreateFileTransacted によって返されたオブジェクトハンドルが不要になり、 トランザクションのコミットまたはロールバックの前に、そのハンドルを閉じるには CloseHandle 関数を 使用します。
NTFS ファイルシステムなどの一部のファイルシステムは、個々のファイルおよび ディレクトリに対する圧縮または暗号化をサポートしています。その種のファイルシステム用にフォーマットされたボリュームでは、新しいファイルはその ディレクトリの圧縮属性と暗号化属性を継承します。
CreateFileTransacted を使用してファイルまたはディレクトリの 圧縮を制御することはできません。詳細については、 File Compression and Decompression および File Encryption を参照してください。
シンボリックリンクの動作—この関数の呼び出しが新しいファイルを作成する場合、動作に変更は ありません。
FILE_FLAG_OPEN_REPARSE_POINT が指定されている場合:
- 既存のファイルが開かれ、それがシンボリックリンクである場合、返されるハンドルはシンボリック リンクへのハンドルです。
- TRUNCATE_EXISTING または FILE_FLAG_DELETE_ON_CLOSE が 指定されている場合、影響を受けるファイルはシンボリックリンクです。
- 既存のファイルが開かれ、それがシンボリックリンクである場合、返されるハンドルは ターゲットへのハンドルです。
- CREATE_ALWAYS、TRUNCATE_EXISTING、または FILE_FLAG_DELETE_ON_CLOSE が指定されている場合、影響を受けるファイルはターゲットです。
前述のとおり、lpSecurityAttributes パラメーターが NULL の場合、 CreateFileTransacted によって返されるハンドルは、アプリケーションが作成する 子プロセスによって継承できません。このパラメーターに関する次の情報も適用されます:
- bInheritHandle が FALSE でない、つまり任意の非ゼロ 値である場合、ハンドルは継承できます。したがって、ハンドルを継承可能にするつもりがない場合は、この構造体メンバーを FALSE に適切に初期化することが重要です。
- ファイルまたはディレクトリの既定のセキュリティ記述子内のアクセス制御リスト (ACL) は、その親ディレクトリ から継承されます。
- ターゲットファイルシステムが、lpSecurityDescriptor がそれらに効果を持つために、ファイルおよびディレクトリ のセキュリティをサポートしている必要があります。これは GetVolumeInformation を使用して判別できます。
| Technology | Supported |
|---|---|
| Server Message Block (SMB) 3.0 プロトコル | No |
| SMB 3.0 Transparent Failover (TFO) | No |
| SMB 3.0 with Scale-out File Shares (SO) | No |
| Cluster Shared Volume File System (CsvFS) | No |
| Resilient File System (ReFS) | No |
SMB 3.0 は TxF をサポートしていないことに注意してください。
Files
フロッピーディスクが入っていないフロッピードライブや、CD が入っていない CD-ROM ドライブ上にファイルを作成しようとすると、 システムはディスクまたは CD を挿入するようユーザーにメッセージを表示します。システムがこのメッセージを 表示しないようにするには、SetErrorMode 関数を SEM_FAILCRITICALERRORS を指定して呼び出します。詳細については、 Creating and Opening Files を参照してください。
ファイルの名前を変更または削除した後、すぐに復元すると、システムは復元する ファイル情報をキャッシュ内で検索します。キャッシュされる情報には、短い名前と長い名前のペアおよび作成時刻が含まれます。
DeleteFile への以前の呼び出しの結果として 削除保留中のファイルに対して CreateFileTransacted を呼び出すと、関数は失敗します。オペレーティングシステムは ファイルへのすべてのハンドルが閉じられるまでファイルの削除を遅延させます。 GetLastError は ERROR_ACCESS_DENIED を返します。
dwDesiredAccess パラメーターは ゼロにすることができ、アプリケーションが適切なセキュリティ設定で実行されている場合に、ファイルにアクセスせずにファイル属性を クエリできます。これは、ファイルを読み取りや書き込みアクセスのために開かずにファイルの存在をテストしたり、 ファイルまたはディレクトリに関するその他の統計を取得したりするのに役立ちます。 Obtaining and Setting File Information および GetFileInformationByHandle を参照してください。
アプリケーションがネットワーク経由でファイルを作成する場合、GENERIC_WRITE 単独を使用するよりも GENERIC_READ | GENERIC_WRITE を使用する方が適切です。リダイレクターが キャッシュマネージャーを使用し、より多くのデータを含むより少ない SMB を送信できるため、結果として得られるコードは高速になります。この組み合わせは、 ネットワーク経由でファイルに書き込む際に時折 ERROR_ACCESS_DENIED が返される問題も回避します。
File Streams
NTFS ファイルシステムでは、 CreateFileTransacted を使用してファイル内に個別のストリームを作成できます。詳細については、 File Streams を参照してください。
Directories
アプリケーションは CreateFileTransacted を使用してディレクトリを作成できないため、この用途では dwCreationDisposition に OPEN_EXISTING 値のみが有効です。 ディレクトリを作成するには、アプリケーションは CreateDirectoryTransacted、 CreateDirectory または CreateDirectoryEx を呼び出す必要があります。CreateFileTransacted を使用してディレクトリを開くには、 dwFlagsAndAttributes の一部として FILE_FLAG_BACKUP_SEMANTICS フラグを指定します。このフラグが SE_BACKUP_NAME および SE_RESTORE_NAME 特権なしで使用される場合でも、適切なセキュリティチェックは引き続き適用されます。
CreateFileTransacted を使用して FAT または FAT32 ファイルシステムボリュームのデフラグ中にディレクトリを開く場合、 MAXIMUM_ALLOWED アクセス権を指定しないでください。これを行うとディレクトリへのアクセスが拒否されます。 代わりに GENERIC_READ アクセス権を指定してください。
詳細については、 About Directory Management を参照してください。
winbase.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして CreateFileTransacted を定義します。エンコーディング中立のエイリアスの使用を、エンコーディング中立でないコードと混在させると、コンパイルエラーまたは実行時エラーを引き起こす不一致につながる可能性があります。詳細については、Conventions for Function Prototypesを参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// KERNEL32.dll (ANSI / -A)
#include <windows.h>
HANDLE CreateFileTransactedA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
FILE_SHARE_MODE dwShareMode,
SECURITY_ATTRIBUTES* lpSecurityAttributes, // optional
FILE_CREATION_DISPOSITION dwCreationDisposition,
FILE_FLAGS_AND_ATTRIBUTES dwFlagsAndAttributes,
HANDLE hTemplateFile, // optional
HANDLE hTransaction,
TXFS_MINIVERSION* pusMiniVersion, // optional
void* lpExtendedParameter // optional
);[DllImport("KERNEL32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern IntPtr CreateFileTransactedA(
[MarshalAs(UnmanagedType.LPStr)] string lpFileName, // LPCSTR
uint dwDesiredAccess, // DWORD
uint dwShareMode, // FILE_SHARE_MODE
IntPtr lpSecurityAttributes, // SECURITY_ATTRIBUTES* optional
uint dwCreationDisposition, // FILE_CREATION_DISPOSITION
uint dwFlagsAndAttributes, // FILE_FLAGS_AND_ATTRIBUTES
IntPtr hTemplateFile, // HANDLE optional
IntPtr hTransaction, // HANDLE
IntPtr pusMiniVersion, // TXFS_MINIVERSION* optional
IntPtr lpExtendedParameter // void* optional
);<DllImport("KERNEL32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CreateFileTransactedA(
<MarshalAs(UnmanagedType.LPStr)> lpFileName As String, ' LPCSTR
dwDesiredAccess As UInteger, ' DWORD
dwShareMode As UInteger, ' FILE_SHARE_MODE
lpSecurityAttributes As IntPtr, ' SECURITY_ATTRIBUTES* optional
dwCreationDisposition As UInteger, ' FILE_CREATION_DISPOSITION
dwFlagsAndAttributes As UInteger, ' FILE_FLAGS_AND_ATTRIBUTES
hTemplateFile As IntPtr, ' HANDLE optional
hTransaction As IntPtr, ' HANDLE
pusMiniVersion As IntPtr, ' TXFS_MINIVERSION* optional
lpExtendedParameter As IntPtr ' void* optional
) As IntPtr
End Function' lpFileName : LPCSTR
' dwDesiredAccess : DWORD
' dwShareMode : FILE_SHARE_MODE
' lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
' dwCreationDisposition : FILE_CREATION_DISPOSITION
' dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES
' hTemplateFile : HANDLE optional
' hTransaction : HANDLE
' pusMiniVersion : TXFS_MINIVERSION* optional
' lpExtendedParameter : void* optional
Declare PtrSafe Function CreateFileTransactedA Lib "kernel32" ( _
ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As LongPtr, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As LongPtr, _
ByVal hTransaction As LongPtr, _
ByVal pusMiniVersion As LongPtr, _
ByVal lpExtendedParameter As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
CreateFileTransactedA = ctypes.windll.kernel32.CreateFileTransactedA
CreateFileTransactedA.restype = ctypes.c_void_p
CreateFileTransactedA.argtypes = [
wintypes.LPCSTR, # lpFileName : LPCSTR
wintypes.DWORD, # dwDesiredAccess : DWORD
wintypes.DWORD, # dwShareMode : FILE_SHARE_MODE
ctypes.c_void_p, # lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
wintypes.DWORD, # dwCreationDisposition : FILE_CREATION_DISPOSITION
wintypes.DWORD, # dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES
wintypes.HANDLE, # hTemplateFile : HANDLE optional
wintypes.HANDLE, # hTransaction : HANDLE
ctypes.c_void_p, # pusMiniVersion : TXFS_MINIVERSION* optional
ctypes.POINTER(None), # lpExtendedParameter : void* optional
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('KERNEL32.dll')
CreateFileTransactedA = Fiddle::Function.new(
lib['CreateFileTransactedA'],
[
Fiddle::TYPE_VOIDP, # lpFileName : LPCSTR
-Fiddle::TYPE_INT, # dwDesiredAccess : DWORD
-Fiddle::TYPE_INT, # dwShareMode : FILE_SHARE_MODE
Fiddle::TYPE_VOIDP, # lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
-Fiddle::TYPE_INT, # dwCreationDisposition : FILE_CREATION_DISPOSITION
-Fiddle::TYPE_INT, # dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES
Fiddle::TYPE_VOIDP, # hTemplateFile : HANDLE optional
Fiddle::TYPE_VOIDP, # hTransaction : HANDLE
Fiddle::TYPE_VOIDP, # pusMiniVersion : TXFS_MINIVERSION* optional
Fiddle::TYPE_VOIDP, # lpExtendedParameter : void* optional
],
Fiddle::TYPE_VOIDP)#[link(name = "kernel32")]
extern "system" {
fn CreateFileTransactedA(
lpFileName: *const u8, // LPCSTR
dwDesiredAccess: u32, // DWORD
dwShareMode: u32, // FILE_SHARE_MODE
lpSecurityAttributes: *mut SECURITY_ATTRIBUTES, // SECURITY_ATTRIBUTES* optional
dwCreationDisposition: u32, // FILE_CREATION_DISPOSITION
dwFlagsAndAttributes: u32, // FILE_FLAGS_AND_ATTRIBUTES
hTemplateFile: *mut core::ffi::c_void, // HANDLE optional
hTransaction: *mut core::ffi::c_void, // HANDLE
pusMiniVersion: *mut u32, // TXFS_MINIVERSION* optional
lpExtendedParameter: *mut () // void* optional
) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("KERNEL32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern IntPtr CreateFileTransactedA([MarshalAs(UnmanagedType.LPStr)] string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile, IntPtr hTransaction, IntPtr pusMiniVersion, IntPtr lpExtendedParameter);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_CreateFileTransactedA' -Namespace Win32 -PassThru
# $api::CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter)#uselib "KERNEL32.dll"
#func global CreateFileTransactedA "CreateFileTransactedA" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CreateFileTransactedA lpFileName, dwDesiredAccess, dwShareMode, varptr(lpSecurityAttributes), dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, varptr(pusMiniVersion), lpExtendedParameter ; 戻り値は stat
; lpFileName : LPCSTR -> "sptr"
; dwDesiredAccess : DWORD -> "sptr"
; dwShareMode : FILE_SHARE_MODE -> "sptr"
; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "sptr"
; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "sptr"
; dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> "sptr"
; hTemplateFile : HANDLE optional -> "sptr"
; hTransaction : HANDLE -> "sptr"
; pusMiniVersion : TXFS_MINIVERSION* optional -> "sptr"
; lpExtendedParameter : void* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "KERNEL32.dll" #cfunc global CreateFileTransactedA "CreateFileTransactedA" str, int, int, var, int, int, sptr, sptr, var, sptr ; res = CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter) ; lpFileName : LPCSTR -> "str" ; dwDesiredAccess : DWORD -> "int" ; dwShareMode : FILE_SHARE_MODE -> "int" ; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "var" ; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "int" ; dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> "int" ; hTemplateFile : HANDLE optional -> "sptr" ; hTransaction : HANDLE -> "sptr" ; pusMiniVersion : TXFS_MINIVERSION* optional -> "var" ; lpExtendedParameter : void* optional -> "sptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "KERNEL32.dll" #cfunc global CreateFileTransactedA "CreateFileTransactedA" str, int, int, sptr, int, int, sptr, sptr, sptr, sptr ; res = CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, varptr(lpSecurityAttributes), dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, varptr(pusMiniVersion), lpExtendedParameter) ; lpFileName : LPCSTR -> "str" ; dwDesiredAccess : DWORD -> "int" ; dwShareMode : FILE_SHARE_MODE -> "int" ; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "sptr" ; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "int" ; dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> "int" ; hTemplateFile : HANDLE optional -> "sptr" ; hTransaction : HANDLE -> "sptr" ; pusMiniVersion : TXFS_MINIVERSION* optional -> "sptr" ; lpExtendedParameter : void* optional -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; HANDLE CreateFileTransactedA(LPCSTR lpFileName, DWORD dwDesiredAccess, FILE_SHARE_MODE dwShareMode, SECURITY_ATTRIBUTES* lpSecurityAttributes, FILE_CREATION_DISPOSITION dwCreationDisposition, FILE_FLAGS_AND_ATTRIBUTES dwFlagsAndAttributes, HANDLE hTemplateFile, HANDLE hTransaction, TXFS_MINIVERSION* pusMiniVersion, void* lpExtendedParameter) #uselib "KERNEL32.dll" #cfunc global CreateFileTransactedA "CreateFileTransactedA" str, int, int, var, int, int, intptr, intptr, var, intptr ; res = CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter) ; lpFileName : LPCSTR -> "str" ; dwDesiredAccess : DWORD -> "int" ; dwShareMode : FILE_SHARE_MODE -> "int" ; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "var" ; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "int" ; dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> "int" ; hTemplateFile : HANDLE optional -> "intptr" ; hTransaction : HANDLE -> "intptr" ; pusMiniVersion : TXFS_MINIVERSION* optional -> "var" ; lpExtendedParameter : void* optional -> "intptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; HANDLE CreateFileTransactedA(LPCSTR lpFileName, DWORD dwDesiredAccess, FILE_SHARE_MODE dwShareMode, SECURITY_ATTRIBUTES* lpSecurityAttributes, FILE_CREATION_DISPOSITION dwCreationDisposition, FILE_FLAGS_AND_ATTRIBUTES dwFlagsAndAttributes, HANDLE hTemplateFile, HANDLE hTransaction, TXFS_MINIVERSION* pusMiniVersion, void* lpExtendedParameter) #uselib "KERNEL32.dll" #cfunc global CreateFileTransactedA "CreateFileTransactedA" str, int, int, intptr, int, int, intptr, intptr, intptr, intptr ; res = CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, varptr(lpSecurityAttributes), dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, varptr(pusMiniVersion), lpExtendedParameter) ; lpFileName : LPCSTR -> "str" ; dwDesiredAccess : DWORD -> "int" ; dwShareMode : FILE_SHARE_MODE -> "int" ; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "intptr" ; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "int" ; dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> "int" ; hTemplateFile : HANDLE optional -> "intptr" ; hTransaction : HANDLE -> "intptr" ; pusMiniVersion : TXFS_MINIVERSION* optional -> "intptr" ; lpExtendedParameter : void* optional -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
procCreateFileTransactedA = kernel32.NewProc("CreateFileTransactedA")
)
// lpFileName (LPCSTR), dwDesiredAccess (DWORD), dwShareMode (FILE_SHARE_MODE), lpSecurityAttributes (SECURITY_ATTRIBUTES* optional), dwCreationDisposition (FILE_CREATION_DISPOSITION), dwFlagsAndAttributes (FILE_FLAGS_AND_ATTRIBUTES), hTemplateFile (HANDLE optional), hTransaction (HANDLE), pusMiniVersion (TXFS_MINIVERSION* optional), lpExtendedParameter (void* optional)
r1, _, err := procCreateFileTransactedA.Call(
uintptr(unsafe.Pointer(windows.BytePtrFromString(lpFileName))),
uintptr(dwDesiredAccess),
uintptr(dwShareMode),
uintptr(lpSecurityAttributes),
uintptr(dwCreationDisposition),
uintptr(dwFlagsAndAttributes),
uintptr(hTemplateFile),
uintptr(hTransaction),
uintptr(pusMiniVersion),
uintptr(lpExtendedParameter),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HANDLEfunction CreateFileTransactedA(
lpFileName: PAnsiChar; // LPCSTR
dwDesiredAccess: DWORD; // DWORD
dwShareMode: DWORD; // FILE_SHARE_MODE
lpSecurityAttributes: Pointer; // SECURITY_ATTRIBUTES* optional
dwCreationDisposition: DWORD; // FILE_CREATION_DISPOSITION
dwFlagsAndAttributes: DWORD; // FILE_FLAGS_AND_ATTRIBUTES
hTemplateFile: THandle; // HANDLE optional
hTransaction: THandle; // HANDLE
pusMiniVersion: Pointer; // TXFS_MINIVERSION* optional
lpExtendedParameter: Pointer // void* optional
): THandle; stdcall;
external 'KERNEL32.dll' name 'CreateFileTransactedA';result := DllCall("KERNEL32\CreateFileTransactedA"
, "AStr", lpFileName ; LPCSTR
, "UInt", dwDesiredAccess ; DWORD
, "UInt", dwShareMode ; FILE_SHARE_MODE
, "Ptr", lpSecurityAttributes ; SECURITY_ATTRIBUTES* optional
, "UInt", dwCreationDisposition ; FILE_CREATION_DISPOSITION
, "UInt", dwFlagsAndAttributes ; FILE_FLAGS_AND_ATTRIBUTES
, "Ptr", hTemplateFile ; HANDLE optional
, "Ptr", hTransaction ; HANDLE
, "Ptr", pusMiniVersion ; TXFS_MINIVERSION* optional
, "Ptr", lpExtendedParameter ; void* optional
, "Ptr") ; return: HANDLE●CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter) = DLL("KERNEL32.dll", "void* CreateFileTransactedA(char*, dword, dword, void*, dword, dword, void*, void*, void*, void*)")
# 呼び出し: CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter)
# lpFileName : LPCSTR -> "char*"
# dwDesiredAccess : DWORD -> "dword"
# dwShareMode : FILE_SHARE_MODE -> "dword"
# lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "void*"
# dwCreationDisposition : FILE_CREATION_DISPOSITION -> "dword"
# dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> "dword"
# hTemplateFile : HANDLE optional -> "void*"
# hTransaction : HANDLE -> "void*"
# pusMiniVersion : TXFS_MINIVERSION* optional -> "void*"
# lpExtendedParameter : void* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "kernel32" fn CreateFileTransactedA(
lpFileName: [*c]const u8, // LPCSTR
dwDesiredAccess: u32, // DWORD
dwShareMode: u32, // FILE_SHARE_MODE
lpSecurityAttributes: [*c]SECURITY_ATTRIBUTES, // SECURITY_ATTRIBUTES* optional
dwCreationDisposition: u32, // FILE_CREATION_DISPOSITION
dwFlagsAndAttributes: u32, // FILE_FLAGS_AND_ATTRIBUTES
hTemplateFile: ?*anyopaque, // HANDLE optional
hTransaction: ?*anyopaque, // HANDLE
pusMiniVersion: [*c]u32, // TXFS_MINIVERSION* optional
lpExtendedParameter: ?*anyopaque // void* optional
) callconv(std.os.windows.WINAPI) ?*anyopaque;proc CreateFileTransactedA(
lpFileName: cstring, # LPCSTR
dwDesiredAccess: uint32, # DWORD
dwShareMode: uint32, # FILE_SHARE_MODE
lpSecurityAttributes: ptr SECURITY_ATTRIBUTES, # SECURITY_ATTRIBUTES* optional
dwCreationDisposition: uint32, # FILE_CREATION_DISPOSITION
dwFlagsAndAttributes: uint32, # FILE_FLAGS_AND_ATTRIBUTES
hTemplateFile: pointer, # HANDLE optional
hTransaction: pointer, # HANDLE
pusMiniVersion: ptr uint32, # TXFS_MINIVERSION* optional
lpExtendedParameter: pointer # void* optional
): pointer {.importc: "CreateFileTransactedA", stdcall, dynlib: "KERNEL32.dll".}pragma(lib, "kernel32");
extern(Windows)
void* CreateFileTransactedA(
const(char)* lpFileName, // LPCSTR
uint dwDesiredAccess, // DWORD
uint dwShareMode, // FILE_SHARE_MODE
SECURITY_ATTRIBUTES* lpSecurityAttributes, // SECURITY_ATTRIBUTES* optional
uint dwCreationDisposition, // FILE_CREATION_DISPOSITION
uint dwFlagsAndAttributes, // FILE_FLAGS_AND_ATTRIBUTES
void* hTemplateFile, // HANDLE optional
void* hTransaction, // HANDLE
uint* pusMiniVersion, // TXFS_MINIVERSION* optional
void* lpExtendedParameter // void* optional
);ccall((:CreateFileTransactedA, "KERNEL32.dll"), stdcall, Ptr{Cvoid},
(Cstring, UInt32, UInt32, Ptr{SECURITY_ATTRIBUTES}, UInt32, UInt32, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{UInt32}, Ptr{Cvoid}),
lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter)
# lpFileName : LPCSTR -> Cstring
# dwDesiredAccess : DWORD -> UInt32
# dwShareMode : FILE_SHARE_MODE -> UInt32
# lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> Ptr{SECURITY_ATTRIBUTES}
# dwCreationDisposition : FILE_CREATION_DISPOSITION -> UInt32
# dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> UInt32
# hTemplateFile : HANDLE optional -> Ptr{Cvoid}
# hTransaction : HANDLE -> Ptr{Cvoid}
# pusMiniVersion : TXFS_MINIVERSION* optional -> Ptr{UInt32}
# lpExtendedParameter : void* optional -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
void* CreateFileTransactedA(
const char* lpFileName,
uint32_t dwDesiredAccess,
uint32_t dwShareMode,
void* lpSecurityAttributes,
uint32_t dwCreationDisposition,
uint32_t dwFlagsAndAttributes,
void* hTemplateFile,
void* hTransaction,
uint32_t* pusMiniVersion,
void* lpExtendedParameter);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter)
-- lpFileName : LPCSTR
-- dwDesiredAccess : DWORD
-- dwShareMode : FILE_SHARE_MODE
-- lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
-- dwCreationDisposition : FILE_CREATION_DISPOSITION
-- dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES
-- hTemplateFile : HANDLE optional
-- hTransaction : HANDLE
-- pusMiniVersion : TXFS_MINIVERSION* optional
-- lpExtendedParameter : void* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const CreateFileTransactedA = lib.func('__stdcall', 'CreateFileTransactedA', 'void *', ['str', 'uint32_t', 'uint32_t', 'void *', 'uint32_t', 'uint32_t', 'void *', 'void *', 'uint32_t *', 'void *']);
// CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter)
// lpFileName : LPCSTR -> 'str'
// dwDesiredAccess : DWORD -> 'uint32_t'
// dwShareMode : FILE_SHARE_MODE -> 'uint32_t'
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> 'void *'
// dwCreationDisposition : FILE_CREATION_DISPOSITION -> 'uint32_t'
// dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> 'uint32_t'
// hTemplateFile : HANDLE optional -> 'void *'
// hTransaction : HANDLE -> 'void *'
// pusMiniVersion : TXFS_MINIVERSION* optional -> 'uint32_t *'
// lpExtendedParameter : void* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("KERNEL32.dll", {
CreateFileTransactedA: { parameters: ["buffer", "u32", "u32", "pointer", "u32", "u32", "pointer", "pointer", "pointer", "pointer"], result: "pointer" },
});
// lib.symbols.CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter)
// lpFileName : LPCSTR -> "buffer"
// dwDesiredAccess : DWORD -> "u32"
// dwShareMode : FILE_SHARE_MODE -> "u32"
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "pointer"
// dwCreationDisposition : FILE_CREATION_DISPOSITION -> "u32"
// dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> "u32"
// hTemplateFile : HANDLE optional -> "pointer"
// hTransaction : HANDLE -> "pointer"
// pusMiniVersion : TXFS_MINIVERSION* optional -> "pointer"
// lpExtendedParameter : void* optional -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
void* CreateFileTransactedA(
const char* lpFileName,
uint32_t dwDesiredAccess,
uint32_t dwShareMode,
void* lpSecurityAttributes,
uint32_t dwCreationDisposition,
uint32_t dwFlagsAndAttributes,
void* hTemplateFile,
void* hTransaction,
uint32_t* pusMiniVersion,
void* lpExtendedParameter);
C, "KERNEL32.dll");
// $ffi->CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, lpExtendedParameter);
// lpFileName : LPCSTR
// dwDesiredAccess : DWORD
// dwShareMode : FILE_SHARE_MODE
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
// dwCreationDisposition : FILE_CREATION_DISPOSITION
// dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES
// hTemplateFile : HANDLE optional
// hTransaction : HANDLE
// pusMiniVersion : TXFS_MINIVERSION* optional
// lpExtendedParameter : void* optional
// 構造体/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);
Pointer CreateFileTransactedA(
String lpFileName, // LPCSTR
int dwDesiredAccess, // DWORD
int dwShareMode, // FILE_SHARE_MODE
Pointer lpSecurityAttributes, // SECURITY_ATTRIBUTES* optional
int dwCreationDisposition, // FILE_CREATION_DISPOSITION
int dwFlagsAndAttributes, // FILE_FLAGS_AND_ATTRIBUTES
Pointer hTemplateFile, // HANDLE optional
Pointer hTransaction, // HANDLE
IntByReference pusMiniVersion, // TXFS_MINIVERSION* optional
Pointer lpExtendedParameter // void* optional
);
}@[Link("kernel32")]
lib LibKERNEL32
fun CreateFileTransactedA = CreateFileTransactedA(
lpFileName : UInt8*, # LPCSTR
dwDesiredAccess : UInt32, # DWORD
dwShareMode : UInt32, # FILE_SHARE_MODE
lpSecurityAttributes : SECURITY_ATTRIBUTES*, # SECURITY_ATTRIBUTES* optional
dwCreationDisposition : UInt32, # FILE_CREATION_DISPOSITION
dwFlagsAndAttributes : UInt32, # FILE_FLAGS_AND_ATTRIBUTES
hTemplateFile : Void*, # HANDLE optional
hTransaction : Void*, # HANDLE
pusMiniVersion : UInt32*, # TXFS_MINIVERSION* optional
lpExtendedParameter : Void* # void* optional
) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef CreateFileTransactedANative = Pointer<Void> Function(Pointer<Utf8>, Uint32, Uint32, Pointer<Void>, Uint32, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>);
typedef CreateFileTransactedADart = Pointer<Void> Function(Pointer<Utf8>, int, int, Pointer<Void>, int, int, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>);
final CreateFileTransactedA = DynamicLibrary.open('KERNEL32.dll')
.lookupFunction<CreateFileTransactedANative, CreateFileTransactedADart>('CreateFileTransactedA');
// lpFileName : LPCSTR -> Pointer<Utf8>
// dwDesiredAccess : DWORD -> Uint32
// dwShareMode : FILE_SHARE_MODE -> Uint32
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> Pointer<Void>
// dwCreationDisposition : FILE_CREATION_DISPOSITION -> Uint32
// dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> Uint32
// hTemplateFile : HANDLE optional -> Pointer<Void>
// hTransaction : HANDLE -> Pointer<Void>
// pusMiniVersion : TXFS_MINIVERSION* optional -> Pointer<Uint32>
// lpExtendedParameter : void* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function CreateFileTransactedA(
lpFileName: PAnsiChar; // LPCSTR
dwDesiredAccess: DWORD; // DWORD
dwShareMode: DWORD; // FILE_SHARE_MODE
lpSecurityAttributes: Pointer; // SECURITY_ATTRIBUTES* optional
dwCreationDisposition: DWORD; // FILE_CREATION_DISPOSITION
dwFlagsAndAttributes: DWORD; // FILE_FLAGS_AND_ATTRIBUTES
hTemplateFile: THandle; // HANDLE optional
hTransaction: THandle; // HANDLE
pusMiniVersion: Pointer; // TXFS_MINIVERSION* optional
lpExtendedParameter: Pointer // void* optional
): THandle; stdcall;
external 'KERNEL32.dll' name 'CreateFileTransactedA';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "CreateFileTransactedA"
c_CreateFileTransactedA :: CString -> Word32 -> Word32 -> Ptr () -> Word32 -> Word32 -> Ptr () -> Ptr () -> Ptr Word32 -> Ptr () -> IO (Ptr ())
-- lpFileName : LPCSTR -> CString
-- dwDesiredAccess : DWORD -> Word32
-- dwShareMode : FILE_SHARE_MODE -> Word32
-- lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> Ptr ()
-- dwCreationDisposition : FILE_CREATION_DISPOSITION -> Word32
-- dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> Word32
-- hTemplateFile : HANDLE optional -> Ptr ()
-- hTransaction : HANDLE -> Ptr ()
-- pusMiniVersion : TXFS_MINIVERSION* optional -> Ptr Word32
-- lpExtendedParameter : void* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let createfiletransacteda =
foreign "CreateFileTransactedA"
(string @-> uint32_t @-> uint32_t @-> (ptr void) @-> uint32_t @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr void) @-> returning (ptr void))
(* lpFileName : LPCSTR -> string *)
(* dwDesiredAccess : DWORD -> uint32_t *)
(* dwShareMode : FILE_SHARE_MODE -> uint32_t *)
(* lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> (ptr void) *)
(* dwCreationDisposition : FILE_CREATION_DISPOSITION -> uint32_t *)
(* dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> uint32_t *)
(* hTemplateFile : HANDLE optional -> (ptr void) *)
(* hTransaction : HANDLE -> (ptr void) *)
(* pusMiniVersion : TXFS_MINIVERSION* optional -> (ptr uint32_t) *)
(* lpExtendedParameter : void* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)
(cffi:defcfun ("CreateFileTransactedA" create-file-transacted-a :convention :stdcall) :pointer
(lp-file-name :string) ; LPCSTR
(dw-desired-access :uint32) ; DWORD
(dw-share-mode :uint32) ; FILE_SHARE_MODE
(lp-security-attributes :pointer) ; SECURITY_ATTRIBUTES* optional
(dw-creation-disposition :uint32) ; FILE_CREATION_DISPOSITION
(dw-flags-and-attributes :uint32) ; FILE_FLAGS_AND_ATTRIBUTES
(h-template-file :pointer) ; HANDLE optional
(h-transaction :pointer) ; HANDLE
(pus-mini-version :pointer) ; TXFS_MINIVERSION* optional
(lp-extended-parameter :pointer)) ; void* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $CreateFileTransactedA = Win32::API::More->new('KERNEL32',
'HANDLE CreateFileTransactedA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPVOID lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile, HANDLE hTransaction, LPVOID pusMiniVersion, LPVOID lpExtendedParameter)');
# my $ret = $CreateFileTransactedA->Call($lpFileName, $dwDesiredAccess, $dwShareMode, $lpSecurityAttributes, $dwCreationDisposition, $dwFlagsAndAttributes, $hTemplateFile, $hTransaction, $pusMiniVersion, $lpExtendedParameter);
# lpFileName : LPCSTR -> LPCSTR
# dwDesiredAccess : DWORD -> DWORD
# dwShareMode : FILE_SHARE_MODE -> DWORD
# lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> LPVOID
# dwCreationDisposition : FILE_CREATION_DISPOSITION -> DWORD
# dwFlagsAndAttributes : FILE_FLAGS_AND_ATTRIBUTES -> DWORD
# hTemplateFile : HANDLE optional -> HANDLE
# hTransaction : HANDLE -> HANDLE
# pusMiniVersion : TXFS_MINIVERSION* optional -> LPVOID
# lpExtendedParameter : void* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f CreateFileTransactedW (Unicode版) — トランザクション内でファイルを作成・オープンする(Unicode版)。
- f CloseHandle — オープンされたオブジェクトハンドルを閉じる。
- f CopyFileTransactedA — トランザクション内で進捗通知付きにファイルをコピーする(ANSI版)。
- f CreateDirectoryTransactedA — トランザクション内でディレクトリを作成する(ANSI版)。
- f DeleteFileTransactedA — トランザクション内で指定ファイルを削除する(ANSI版)。
- f FindFirstFileTransactedA — トランザクション内でファイル検索を開始する(ANSI版)。
- f GetFileAttributesTransactedA — トランザクション内でファイル属性情報を取得する(ANSI版)。
- f MoveFileTransactedA — トランザクション内でファイルを移動・改名する(ANSI版)。
- f ReadFile — ファイルやデバイスからデータを読み込む。
- f WriteFile — ファイルやデバイスにデータを書き込む。