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

CreateFileFromAppW

関数
アプリコンテナからファイルを作成または開く。
DLLapi-ms-win-core-file-fromapp-l1-1-0.dll呼出規約winapi

シグネチャ

// api-ms-win-core-file-fromapp-l1-1-0.dll
#include <windows.h>

HANDLE CreateFileFromAppW(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    SECURITY_ATTRIBUTES* lpSecurityAttributes,   // optional
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile   // optional
);

パラメーター

名前方向説明
lpFileNameLPCWSTRin

作成または開くファイルまたはデバイスの名前です。この名前にはスラッシュ (/) とバックスラッシュ (\) のどちらも使用できます。

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

特殊なデバイス名については、MS-DOS デバイス名の定義を参照してください。

ファイル ストリームを作成するには、ファイル名、コロン、続いてストリーム名を指定します。詳細については、ファイル ストリームを参照してください。

この関数の Unicode バージョン (CreateFileFromAppW) では、"\\?\" を付加せずに MAX_PATH の制限を解除するオプトインが可能です。詳細については、ファイル、パス、名前空間の名前付けの「Maximum Path Length Limitation」セクションを参照してください。

dwDesiredAccessDWORDin

ファイルまたはデバイスに対して要求するアクセスです。読み取り、書き込み、その両方、またはいずれでもない (ゼロ) のいずれかにまとめられます。

最もよく使用される値は GENERIC_READGENERIC_WRITE、またはその両方 (GENERIC_READ | GENERIC_WRITE) です。詳細については、ジェネリック アクセス権ファイルのセキュリティとアクセス権ファイル アクセス権定数、および ACCESS_MASK を参照してください。

このパラメーターがゼロの場合、アプリケーションは、たとえ GENERIC_READ アクセスが拒否されるような場合であっても、そのファイルまたはデバイスにアクセスすることなく、ファイル、ディレクトリ、デバイスの属性などの特定のメタデータを照会できます。

すでに開いているハンドルを持つオープン要求において dwShareMode パラメーターで指定された共有モードと競合するアクセス モードを要求することはできません。

dwShareModeDWORDin

ファイルまたはデバイスに対して要求する共有モードです。読み取り、書き込み、その両方、削除、これらすべて、またはなしのいずれかを指定できます (次の表を参照)。属性または拡張属性へのアクセス要求は、このフラグの影響を受けません。

意味
0 0x00000000

他のプロセスが削除、読み取り、または書き込みアクセスを要求する場合に、それらがファイルまたはデバイスを開くことを禁止します。

FILE_SHARE_DELETE 0x00000004

ファイルまたはデバイスに対する後続のオープン操作が削除アクセスを要求できるようにします。

そうでない場合、他のプロセスは削除アクセスを要求するとファイルまたはデバイスを開くことができません。

このフラグが指定されていないものの、ファイルまたはデバイスがすでに削除アクセスで開かれている場合、関数は失敗します。

注意 削除アクセスでは、削除操作と名前変更操作の両方が許可されます。
FILE_SHARE_READ 0x00000001

ファイルまたはデバイスに対する後続のオープン操作が読み取りアクセスを要求できるようにします。

そうでない場合、他のプロセスは読み取りアクセスを要求するとファイルまたはデバイスを開くことができません。

このフラグが指定されていないものの、ファイルまたはデバイスがすでに読み取りアクセスで開かれている場合、関数は失敗します。

FILE_SHARE_WRITE 0x00000002

ファイルまたはデバイスに対する後続のオープン操作が書き込みアクセスを要求できるようにします。

そうでない場合、他のプロセスは書き込みアクセスを要求するとファイルまたはデバイスを開くことができません。

このフラグが指定されていないものの、ファイルまたはデバイスがすでに書き込みアクセスで開かれているか、書き込みアクセス付きのファイル マッピングを持つ場合、関数は失敗します。

lpSecurityAttributesSECURITY_ATTRIBUTES*inoptional

SECURITY_ATTRIBUTES 構造体へのポインターです。この構造体には、別個でありながら関連する 2 つのデータ メンバー、すなわち省略可能なセキュリティ記述子と、返されたハンドルを子プロセスが継承できるかどうかを決定するブール値が含まれます。

このパラメーターには NULL を指定できます。

このパラメーターが NULL の場合、返されたハンドルは、アプリケーションが作成する子プロセスのいずれにも継承されず、返されたハンドルに関連付けられたファイルまたはデバイスには既定のセキュリティ記述子が割り当てられます。

構造体の lpSecurityDescriptor メンバーは、ファイルまたはデバイスの SECURITY_DESCRIPTOR を指定します。このメンバーが NULL の場合、返されたハンドルに関連付けられたファイルまたはデバイスには既定のセキュリティ記述子が割り当てられます。

この関数は、既存のファイルまたはデバイスを開くときには lpSecurityDescriptor メンバーを無視しますが、bInheritHandle メンバーは引き続き使用します。

構造体の bInheritHandle メンバーは、返されたハンドルを継承できるかどうかを指定します。

dwCreationDispositionDWORDin

存在する、または存在しないファイルまたはデバイスに対して実行するアクションです。

ファイル以外のデバイスの場合、このパラメーターは通常 OPEN_EXISTING に設定されます。

詳細については、「解説」セクションを参照してください。

このパラメーターは、次の値のいずれか 1 つでなければならず、組み合わせることはできません。

意味
CREATE_ALWAYS 2

常に新しいファイルを作成します。

指定されたファイルが存在し、書き込み可能な場合、関数はファイルを切り詰め、成功し、最終エラー コードは ERROR_ALREADY_EXISTS (183) に設定されます。

指定されたファイルが存在せず、有効なパスである場合、新しいファイルが作成され、関数は成功し、最終エラー コードはゼロに設定されます。

詳細については、このトピックの「解説」セクションを参照してください。

CREATE_NEW 1

ファイルがまだ存在しない場合に限り、新しいファイルを作成します。

指定されたファイルが存在する場合、関数は失敗し、最終エラー コードは ERROR_FILE_EXISTS (80) に設定されます。

指定されたファイルが存在せず、書き込み可能な場所への有効なパスである場合、新しいファイルが作成されます。

OPEN_ALWAYS 4

常にファイルを開きます。

指定されたファイルが存在する場合、関数は成功し、最終エラー コードは ERROR_ALREADY_EXISTS (183) に設定されます。

指定されたファイルが存在せず、書き込み可能な場所への有効なパスである場合、関数はファイルを作成し、最終エラー コードはゼロに設定されます。

OPEN_EXISTING 3

ファイルまたはデバイスが存在する場合に限り、それを開きます。

指定されたファイルまたはデバイスが存在しない場合、関数は失敗し、最終エラー コードは ERROR_FILE_NOT_FOUND (2) に設定されます。

デバイスの詳細については、「解説」セクションを参照してください。

TRUNCATE_EXISTING 5

ファイルが存在する場合に限り、そのファイルを開き、サイズが 0 バイトになるように切り詰めます。

指定されたファイルが存在しない場合、関数は失敗し、最終エラー コードは ERROR_FILE_NOT_FOUND (2) に設定されます。

呼び出し元のプロセスは、dwDesiredAccess パラメーターの一部として GENERIC_WRITE ビットを設定してファイルを開く必要があります。

dwFlagsAndAttributesDWORDin

ファイルまたはデバイスの属性とフラグです。FILE_ATTRIBUTE_NORMAL が、ファイルにとって最も一般的な既定値です。

このパラメーターには、利用可能なファイル属性 (FILE_ATTRIBUTE_*) の任意の組み合わせを含めることができます。その他のすべてのファイル属性は FILE_ATTRIBUTE_NORMAL を上書きします。

このパラメーターには、ファイルまたはデバイスのキャッシュ動作、アクセス モード、その他の特殊用途のフラグを制御するためのフラグ (FILE_FLAG_*) の組み合わせを含めることもできます。これらは任意の FILE_ATTRIBUTE_* 値と組み合わせられます。

このパラメーターには、SECURITY_SQOS_PRESENT フラグを指定することで、セキュリティ サービス品質 (SQOS) 情報を含めることもできます。SQOS 関連のフラグに関する追加情報は、属性とフラグの表に続く表に示されています。

属性 意味
FILE_ATTRIBUTE_ARCHIVE 32 (0x20)

ファイルをアーカイブする必要があることを示します。アプリケーションはこの属性を使用して、バックアップまたは削除の対象となるファイルにマークを付けます。

FILE_ATTRIBUTE_ENCRYPTED 16384 (0x4000)

ファイルまたはディレクトリが暗号化されています。ファイルの場合、これはファイル内のすべてのデータが暗号化されていることを意味します。ディレクトリの場合、これは新しく作成されるファイルおよびサブディレクトリに対して暗号化が既定となることを意味します。詳細については、ファイルの暗号化を参照してください。

このフラグは、FILE_ATTRIBUTE_SYSTEM も指定されている場合は効果がありません。

このフラグは、Windows の Home、Home Premium、Starter、または ARM エディションではサポートされていません。

FILE_ATTRIBUTE_HIDDEN 2 (0x2)

ファイルが隠しファイルです。通常のディレクトリ一覧には含めないでください。

FILE_ATTRIBUTE_NORMAL 128 (0x80)

ファイルに他の属性が設定されていません。この属性は単独で使用される場合にのみ有効です。

FILE_ATTRIBUTE_OFFLINE 4096 (0x1000)

ファイルのデータがすぐには利用できません。この属性は、ファイル データが物理的にオフライン ストレージに移動されたことを示します。この属性は、階層型ストレージ管理ソフトウェアであるリモート記憶域によって使用されます。アプリケーションはこの属性を任意に変更すべきではありません。

FILE_ATTRIBUTE_READONLY 1 (0x1)

ファイルが読み取り専用です。アプリケーションはファイルを読み取ることはできますが、書き込みや削除はできません。

FILE_ATTRIBUTE_SYSTEM 4 (0x4)

ファイルがオペレーティング システムの一部であるか、オペレーティング システムによって排他的に使用されています。

FILE_ATTRIBUTE_TEMPORARY 256 (0x100)

ファイルが一時的な記憶域として使用されています。

詳細については、このトピックの「キャッシュ動作」セクションを参照してください。

フラグ 意味
FILE_FLAG_BACKUP_SEMANTICS 0x02000000

ファイルがバックアップまたは復元操作のために開かれているか作成されています。システムは、プロセスが SE_BACKUP_NAME および SE_RESTORE_NAME 特権を持つ場合に、呼び出し元のプロセスがファイル セキュリティ チェックを上書きすることを保証します。詳細については、トークン内の特権の変更を参照してください。

ディレクトリへのハンドルを取得するには、このフラグを設定する必要があります。ディレクトリ ハンドルは、一部の関数にファイル ハンドルの代わりに渡すことができます。詳細については、「解説」セクションを参照してください。

FILE_FLAG_DELETE_ON_CLOSE 0x04000000

指定されたハンドルおよびその他の開かれている、または複製されたハンドルを含む、すべてのハンドルが閉じられた直後にファイルが削除されます。

ファイルに対して既存の開かれているハンドルがある場合、それらがすべて FILE_SHARE_DELETE 共有モードで開かれていない限り、呼び出しは失敗します。

ファイルに対する後続のオープン要求は、FILE_SHARE_DELETE 共有モードが指定されていない限り失敗します。

FILE_FLAG_NO_BUFFERING 0x20000000

データの読み取りと書き込みに対してシステム キャッシュを使用せずにファイルまたはデバイスが開かれます。このフラグは、ハード ディスクのキャッシュやメモリ マップト ファイルには影響しません。

FILE_FLAG_NO_BUFFERING フラグを使用してこの関数で開いたファイルを正常に扱うには厳格な要件があります。詳細については、ファイル バッファリングを参照してください。

FILE_FLAG_OPEN_NO_RECALL 0x00100000

ファイル データが要求されますが、引き続きリモート記憶域に配置されたままにする必要があります。ローカル ストレージに戻して転送すべきではありません。このフラグはリモート記憶域システムが使用するためのものです。

FILE_FLAG_OPEN_REPARSE_POINT 0x00200000

通常の再解析ポイント処理は行われません。この関数は再解析ポイントを開こうとします。ファイルが開かれると、再解析ポイントを制御するフィルターが動作しているかどうかにかかわらず、ファイル ハンドルが返されます。

このフラグは CREATE_ALWAYS フラグとともに使用することはできません。

ファイルが再解析ポイントでない場合、このフラグは無視されます。

詳細については、「解説」セクションを参照してください。

FILE_FLAG_OVERLAPPED 0x40000000

非同期 I/O のためにファイルまたはデバイスが開かれているか作成されています。

このハンドルで後続の I/O 操作が完了すると、OVERLAPPED 構造体で指定されたイベントがシグナル状態に設定されます。

このフラグが指定されている場合、ファイルは読み取り操作と書き込み操作を同時に行うために使用できます。

このフラグが指定されていない場合、読み取り関数および書き込み関数の呼び出しで OVERLAPPED 構造体を指定したとしても、I/O 操作はシリアル化されます。

このフラグで作成されたファイル ハンドルを使用する際の考慮事項については、このトピックの「同期 I/O ハンドルと非同期 I/O ハンドル」セクションを参照してください。

FILE_FLAG_POSIX_SEMANTICS 0x0100000

アクセスは POSIX 規則に従って行われます。これには、その名前付けをサポートするファイル システムにおいて、大文字と小文字のみが異なる複数のファイルを許可することが含まれます。このオプションを使用する際は注意してください。このフラグで作成されたファイルは、MS-DOS または 16 ビット Windows 向けに書かれたアプリケーションからアクセスできない場合があるためです。

FILE_FLAG_RANDOM_ACCESS 0x10000000

アクセスがランダムに行われることを意図しています。システムはこれをファイル キャッシュを最適化するためのヒントとして使用できます。

このフラグは、ファイル システムがキャッシュされた I/O と FILE_FLAG_NO_BUFFERING をサポートしていない場合は効果がありません。

詳細については、このトピックの「キャッシュ動作」セクションを参照してください。

FILE_FLAG_SESSION_AWARE 0x00800000

セッション認識付きでファイルまたはデバイスが開かれています。このフラグが指定されていない場合、セッションごとのデバイス (RemoteFX USB リダイレクトを使用するデバイスなど) は、セッション 0 で実行されているプロセスから開くことができません。このフラグは、セッション 0 にいない呼び出し元には効果がありません。このフラグは Windows のサーバー エディションでのみサポートされます。

FILE_FLAG_SEQUENTIAL_SCAN 0x08000000

アクセスが先頭から末尾まで順次行われることを意図しています。システムはこれをファイル キャッシュを最適化するためのヒントとして使用できます。

このフラグは、リードビハインド (つまり逆方向スキャン) を使用する場合は使用すべきではありません。

このフラグは、ファイル システムがキャッシュされた I/O と FILE_FLAG_NO_BUFFERING をサポートしていない場合は効果がありません。

詳細については、このトピックの「キャッシュ動作」セクションを参照してください。

FILE_FLAG_WRITE_THROUGH 0x80000000

書き込み操作は中間キャッシュを経由せず、直接ディスクに書き込まれます。

追加情報については、このトピックの「キャッシュ動作」セクションを参照してください。

dwFlagsAndAttributes パラメーターは SQOS 情報も指定できます。詳細については、偽装レベルを参照してください。呼び出し元のアプリケーションが dwFlagsAndAttributes の一部として SECURITY_SQOS_PRESENT フラグを指定する場合、次の値のうち 1 つ以上を含めることもできます。

セキュリティ フラグ 意味
SECURITY_ANONYMOUS

匿名 (Anonymous) の偽装レベルでクライアントを偽装します。

SECURITY_CONTEXT_TRACKING

セキュリティ追跡モードが動的です。このフラグが指定されていない場合、セキュリティ追跡モードは静的です。

SECURITY_DELEGATION

委任 (Delegation) の偽装レベルでクライアントを偽装します。

SECURITY_EFFECTIVE_ONLY

クライアントのセキュリティ コンテキストのうち、有効になっている側面のみがサーバーで利用可能になります。このフラグを指定しない場合、クライアントのセキュリティ コンテキストのすべての側面が利用可能になります。

これにより、クライアントは、サーバーがクライアントを偽装する際に使用できるグループと特権を制限できます。

SECURITY_IDENTIFICATION

識別 (Identification) の偽装レベルでクライアントを偽装します。

SECURITY_IMPERSONATION

偽装 (Impersonation) レベルでクライアントを偽装します。これは、SECURITY_SQOS_PRESENT フラグとともに他のフラグが指定されていない場合の既定の動作です。

hTemplateFileHANDLEinoptional

GENERIC_READ アクセス権を持つテンプレート ファイルへの有効なハンドルです。テンプレート ファイルは、作成されるファイルに対してファイル属性と拡張属性を提供します。

このパラメーターには NULL を指定できます。

既存のファイルを開くとき、このパラメーターは無視されます。

新しい暗号化されたファイルを開くとき、ファイルは親ディレクトリから随意アクセス制御リストを継承します。詳細については、ファイルの暗号化を参照してください。

戻り値の型: HANDLE

公式ドキュメント

ファイルまたは I/O デバイスを作成または開きます。この関数の動作は CreateFile と同一ですが、本関数はユニバーサル Windows プラットフォーム アプリのセキュリティ モデルに準拠します。

戻り値

関数が成功した場合、戻り値は指定されたファイル、デバイス、名前付きパイプ、またはメールスロットへの開かれたハンドルです。

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

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

各言語での呼び出し定義

// api-ms-win-core-file-fromapp-l1-1-0.dll
#include <windows.h>

HANDLE CreateFileFromAppW(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    SECURITY_ATTRIBUTES* lpSecurityAttributes,   // optional
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile   // optional
);
[DllImport("api-ms-win-core-file-fromapp-l1-1-0.dll", ExactSpelling = true)]
static extern IntPtr CreateFileFromAppW(
    [MarshalAs(UnmanagedType.LPWStr)] string lpFileName,   // LPCWSTR
    uint dwDesiredAccess,   // DWORD
    uint dwShareMode,   // DWORD
    IntPtr lpSecurityAttributes,   // SECURITY_ATTRIBUTES* optional
    uint dwCreationDisposition,   // DWORD
    uint dwFlagsAndAttributes,   // DWORD
    IntPtr hTemplateFile   // HANDLE optional
);
<DllImport("api-ms-win-core-file-fromapp-l1-1-0.dll", ExactSpelling:=True)>
Public Shared Function CreateFileFromAppW(
    <MarshalAs(UnmanagedType.LPWStr)> lpFileName As String,   ' LPCWSTR
    dwDesiredAccess As UInteger,   ' DWORD
    dwShareMode As UInteger,   ' DWORD
    lpSecurityAttributes As IntPtr,   ' SECURITY_ATTRIBUTES* optional
    dwCreationDisposition As UInteger,   ' DWORD
    dwFlagsAndAttributes As UInteger,   ' DWORD
    hTemplateFile As IntPtr   ' HANDLE optional
) As IntPtr
End Function
' lpFileName : LPCWSTR
' dwDesiredAccess : DWORD
' dwShareMode : DWORD
' lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
' dwCreationDisposition : DWORD
' dwFlagsAndAttributes : DWORD
' hTemplateFile : HANDLE optional
Declare PtrSafe Function CreateFileFromAppW Lib "api-ms-win-core-file-fromapp-l1-1-0" ( _
    ByVal lpFileName As LongPtr, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As LongPtr, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CreateFileFromAppW = ctypes.windll.LoadLibrary("api-ms-win-core-file-fromapp-l1-1-0.dll").CreateFileFromAppW
CreateFileFromAppW.restype = ctypes.c_void_p
CreateFileFromAppW.argtypes = [
    wintypes.LPCWSTR,  # lpFileName : LPCWSTR
    wintypes.DWORD,  # dwDesiredAccess : DWORD
    wintypes.DWORD,  # dwShareMode : DWORD
    ctypes.c_void_p,  # lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
    wintypes.DWORD,  # dwCreationDisposition : DWORD
    wintypes.DWORD,  # dwFlagsAndAttributes : DWORD
    wintypes.HANDLE,  # hTemplateFile : HANDLE optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('api-ms-win-core-file-fromapp-l1-1-0.dll')
CreateFileFromAppW = Fiddle::Function.new(
  lib['CreateFileFromAppW'],
  [
    Fiddle::TYPE_VOIDP,  # lpFileName : LPCWSTR
    -Fiddle::TYPE_INT,  # dwDesiredAccess : DWORD
    -Fiddle::TYPE_INT,  # dwShareMode : DWORD
    Fiddle::TYPE_VOIDP,  # lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
    -Fiddle::TYPE_INT,  # dwCreationDisposition : DWORD
    -Fiddle::TYPE_INT,  # dwFlagsAndAttributes : DWORD
    Fiddle::TYPE_VOIDP,  # hTemplateFile : HANDLE optional
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "api-ms-win-core-file-fromapp-l1-1-0")]
extern "system" {
    fn CreateFileFromAppW(
        lpFileName: *const u16,  // LPCWSTR
        dwDesiredAccess: u32,  // DWORD
        dwShareMode: u32,  // DWORD
        lpSecurityAttributes: *mut SECURITY_ATTRIBUTES,  // SECURITY_ATTRIBUTES* optional
        dwCreationDisposition: u32,  // DWORD
        dwFlagsAndAttributes: u32,  // DWORD
        hTemplateFile: *mut core::ffi::c_void  // HANDLE optional
    ) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("api-ms-win-core-file-fromapp-l1-1-0.dll")]
public static extern IntPtr CreateFileFromAppW([MarshalAs(UnmanagedType.LPWStr)] string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
"@
$api = Add-Type -MemberDefinition $sig -Name 'api-ms-win-core-file-fromapp-l1-1-0_CreateFileFromAppW' -Namespace Win32 -PassThru
# $api::CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
#uselib "api-ms-win-core-file-fromapp-l1-1-0.dll"
#func global CreateFileFromAppW "CreateFileFromAppW" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CreateFileFromAppW lpFileName, dwDesiredAccess, dwShareMode, varptr(lpSecurityAttributes), dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile   ; 戻り値は stat
; lpFileName : LPCWSTR -> "sptr"
; dwDesiredAccess : DWORD -> "sptr"
; dwShareMode : DWORD -> "sptr"
; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "sptr"
; dwCreationDisposition : DWORD -> "sptr"
; dwFlagsAndAttributes : DWORD -> "sptr"
; hTemplateFile : HANDLE optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "api-ms-win-core-file-fromapp-l1-1-0.dll"
#cfunc global CreateFileFromAppW "CreateFileFromAppW" wstr, int, int, var, int, int, sptr
; res = CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
; lpFileName : LPCWSTR -> "wstr"
; dwDesiredAccess : DWORD -> "int"
; dwShareMode : DWORD -> "int"
; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "var"
; dwCreationDisposition : DWORD -> "int"
; dwFlagsAndAttributes : DWORD -> "int"
; hTemplateFile : HANDLE optional -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HANDLE CreateFileFromAppW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, SECURITY_ATTRIBUTES* lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
#uselib "api-ms-win-core-file-fromapp-l1-1-0.dll"
#cfunc global CreateFileFromAppW "CreateFileFromAppW" wstr, int, int, var, int, int, intptr
; res = CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
; lpFileName : LPCWSTR -> "wstr"
; dwDesiredAccess : DWORD -> "int"
; dwShareMode : DWORD -> "int"
; lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "var"
; dwCreationDisposition : DWORD -> "int"
; dwFlagsAndAttributes : DWORD -> "int"
; hTemplateFile : HANDLE optional -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	api_ms_win_core_file_fromapp_l1_1_0 = windows.NewLazySystemDLL("api-ms-win-core-file-fromapp-l1-1-0.dll")
	procCreateFileFromAppW = api_ms_win_core_file_fromapp_l1_1_0.NewProc("CreateFileFromAppW")
)

// lpFileName (LPCWSTR), dwDesiredAccess (DWORD), dwShareMode (DWORD), lpSecurityAttributes (SECURITY_ATTRIBUTES* optional), dwCreationDisposition (DWORD), dwFlagsAndAttributes (DWORD), hTemplateFile (HANDLE optional)
r1, _, err := procCreateFileFromAppW.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpFileName))),
	uintptr(dwDesiredAccess),
	uintptr(dwShareMode),
	uintptr(lpSecurityAttributes),
	uintptr(dwCreationDisposition),
	uintptr(dwFlagsAndAttributes),
	uintptr(hTemplateFile),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HANDLE
function CreateFileFromAppW(
  lpFileName: PWideChar;   // LPCWSTR
  dwDesiredAccess: DWORD;   // DWORD
  dwShareMode: DWORD;   // DWORD
  lpSecurityAttributes: Pointer;   // SECURITY_ATTRIBUTES* optional
  dwCreationDisposition: DWORD;   // DWORD
  dwFlagsAndAttributes: DWORD;   // DWORD
  hTemplateFile: THandle   // HANDLE optional
): THandle; stdcall;
  external 'api-ms-win-core-file-fromapp-l1-1-0.dll' name 'CreateFileFromAppW';
result := DllCall("api-ms-win-core-file-fromapp-l1-1-0\CreateFileFromAppW"
    , "WStr", lpFileName   ; LPCWSTR
    , "UInt", dwDesiredAccess   ; DWORD
    , "UInt", dwShareMode   ; DWORD
    , "Ptr", lpSecurityAttributes   ; SECURITY_ATTRIBUTES* optional
    , "UInt", dwCreationDisposition   ; DWORD
    , "UInt", dwFlagsAndAttributes   ; DWORD
    , "Ptr", hTemplateFile   ; HANDLE optional
    , "Ptr")   ; return: HANDLE
●CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile) = DLL("api-ms-win-core-file-fromapp-l1-1-0.dll", "void* CreateFileFromAppW(char*, dword, dword, void*, dword, dword, void*)")
# 呼び出し: CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
# lpFileName : LPCWSTR -> "char*"
# dwDesiredAccess : DWORD -> "dword"
# dwShareMode : DWORD -> "dword"
# lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "void*"
# dwCreationDisposition : DWORD -> "dword"
# dwFlagsAndAttributes : DWORD -> "dword"
# hTemplateFile : HANDLE optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "api-ms-win-core-file-fromapp-l1-1-0" fn CreateFileFromAppW(
    lpFileName: [*c]const u16, // LPCWSTR
    dwDesiredAccess: u32, // DWORD
    dwShareMode: u32, // DWORD
    lpSecurityAttributes: [*c]SECURITY_ATTRIBUTES, // SECURITY_ATTRIBUTES* optional
    dwCreationDisposition: u32, // DWORD
    dwFlagsAndAttributes: u32, // DWORD
    hTemplateFile: ?*anyopaque // HANDLE optional
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc CreateFileFromAppW(
    lpFileName: WideCString,  # LPCWSTR
    dwDesiredAccess: uint32,  # DWORD
    dwShareMode: uint32,  # DWORD
    lpSecurityAttributes: ptr SECURITY_ATTRIBUTES,  # SECURITY_ATTRIBUTES* optional
    dwCreationDisposition: uint32,  # DWORD
    dwFlagsAndAttributes: uint32,  # DWORD
    hTemplateFile: pointer  # HANDLE optional
): pointer {.importc: "CreateFileFromAppW", stdcall, dynlib: "api-ms-win-core-file-fromapp-l1-1-0.dll".}
pragma(lib, "api-ms-win-core-file-fromapp-l1-1-0");
extern(Windows)
void* CreateFileFromAppW(
    const(wchar)* lpFileName,   // LPCWSTR
    uint dwDesiredAccess,   // DWORD
    uint dwShareMode,   // DWORD
    SECURITY_ATTRIBUTES* lpSecurityAttributes,   // SECURITY_ATTRIBUTES* optional
    uint dwCreationDisposition,   // DWORD
    uint dwFlagsAndAttributes,   // DWORD
    void* hTemplateFile   // HANDLE optional
);
ccall((:CreateFileFromAppW, "api-ms-win-core-file-fromapp-l1-1-0.dll"), stdcall, Ptr{Cvoid},
      (Cwstring, UInt32, UInt32, Ptr{SECURITY_ATTRIBUTES}, UInt32, UInt32, Ptr{Cvoid}),
      lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
# lpFileName : LPCWSTR -> Cwstring
# dwDesiredAccess : DWORD -> UInt32
# dwShareMode : DWORD -> UInt32
# lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> Ptr{SECURITY_ATTRIBUTES}
# dwCreationDisposition : DWORD -> UInt32
# dwFlagsAndAttributes : DWORD -> UInt32
# hTemplateFile : HANDLE optional -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* CreateFileFromAppW(
    const uint16_t* lpFileName,
    uint32_t dwDesiredAccess,
    uint32_t dwShareMode,
    void* lpSecurityAttributes,
    uint32_t dwCreationDisposition,
    uint32_t dwFlagsAndAttributes,
    void* hTemplateFile);
]]
local api-ms-win-core-file-fromapp-l1-1-0 = ffi.load("api-ms-win-core-file-fromapp-l1-1-0")
-- api-ms-win-core-file-fromapp-l1-1-0.CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
-- lpFileName : LPCWSTR
-- dwDesiredAccess : DWORD
-- dwShareMode : DWORD
-- lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
-- dwCreationDisposition : DWORD
-- dwFlagsAndAttributes : DWORD
-- hTemplateFile : HANDLE optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('api-ms-win-core-file-fromapp-l1-1-0.dll');
const CreateFileFromAppW = lib.func('__stdcall', 'CreateFileFromAppW', 'void *', ['str16', 'uint32_t', 'uint32_t', 'void *', 'uint32_t', 'uint32_t', 'void *']);
// CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
// lpFileName : LPCWSTR -> 'str16'
// dwDesiredAccess : DWORD -> 'uint32_t'
// dwShareMode : DWORD -> 'uint32_t'
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> 'void *'
// dwCreationDisposition : DWORD -> 'uint32_t'
// dwFlagsAndAttributes : DWORD -> 'uint32_t'
// hTemplateFile : HANDLE optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("api-ms-win-core-file-fromapp-l1-1-0.dll", {
  CreateFileFromAppW: { parameters: ["buffer", "u32", "u32", "pointer", "u32", "u32", "pointer"], result: "pointer" },
});
// lib.symbols.CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
// lpFileName : LPCWSTR -> "buffer"
// dwDesiredAccess : DWORD -> "u32"
// dwShareMode : DWORD -> "u32"
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> "pointer"
// dwCreationDisposition : DWORD -> "u32"
// dwFlagsAndAttributes : DWORD -> "u32"
// hTemplateFile : HANDLE optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* CreateFileFromAppW(
    const uint16_t* lpFileName,
    uint32_t dwDesiredAccess,
    uint32_t dwShareMode,
    void* lpSecurityAttributes,
    uint32_t dwCreationDisposition,
    uint32_t dwFlagsAndAttributes,
    void* hTemplateFile);
C, "api-ms-win-core-file-fromapp-l1-1-0.dll");
// $ffi->CreateFileFromAppW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
// lpFileName : LPCWSTR
// dwDesiredAccess : DWORD
// dwShareMode : DWORD
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional
// dwCreationDisposition : DWORD
// dwFlagsAndAttributes : DWORD
// hTemplateFile : HANDLE 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 Api-ms-win-core-file-fromapp-l1-1-0 extends StdCallLibrary {
    Api-ms-win-core-file-fromapp-l1-1-0 INSTANCE = Native.load("api-ms-win-core-file-fromapp-l1-1-0", Api-ms-win-core-file-fromapp-l1-1-0.class);
    Pointer CreateFileFromAppW(
        WString lpFileName,   // LPCWSTR
        int dwDesiredAccess,   // DWORD
        int dwShareMode,   // DWORD
        Pointer lpSecurityAttributes,   // SECURITY_ATTRIBUTES* optional
        int dwCreationDisposition,   // DWORD
        int dwFlagsAndAttributes,   // DWORD
        Pointer hTemplateFile   // HANDLE optional
    );
}
@[Link("api-ms-win-core-file-fromapp-l1-1-0")]
lib Libapi-ms-win-core-file-fromapp-l1-1-0
  fun CreateFileFromAppW = CreateFileFromAppW(
    lpFileName : UInt16*,   # LPCWSTR
    dwDesiredAccess : UInt32,   # DWORD
    dwShareMode : UInt32,   # DWORD
    lpSecurityAttributes : SECURITY_ATTRIBUTES*,   # SECURITY_ATTRIBUTES* optional
    dwCreationDisposition : UInt32,   # DWORD
    dwFlagsAndAttributes : UInt32,   # DWORD
    hTemplateFile : Void*   # HANDLE optional
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CreateFileFromAppWNative = Pointer<Void> Function(Pointer<Utf16>, Uint32, Uint32, Pointer<Void>, Uint32, Uint32, Pointer<Void>);
typedef CreateFileFromAppWDart = Pointer<Void> Function(Pointer<Utf16>, int, int, Pointer<Void>, int, int, Pointer<Void>);
final CreateFileFromAppW = DynamicLibrary.open('api-ms-win-core-file-fromapp-l1-1-0.dll')
    .lookupFunction<CreateFileFromAppWNative, CreateFileFromAppWDart>('CreateFileFromAppW');
// lpFileName : LPCWSTR -> Pointer<Utf16>
// dwDesiredAccess : DWORD -> Uint32
// dwShareMode : DWORD -> Uint32
// lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> Pointer<Void>
// dwCreationDisposition : DWORD -> Uint32
// dwFlagsAndAttributes : DWORD -> Uint32
// hTemplateFile : HANDLE optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CreateFileFromAppW(
  lpFileName: PWideChar;   // LPCWSTR
  dwDesiredAccess: DWORD;   // DWORD
  dwShareMode: DWORD;   // DWORD
  lpSecurityAttributes: Pointer;   // SECURITY_ATTRIBUTES* optional
  dwCreationDisposition: DWORD;   // DWORD
  dwFlagsAndAttributes: DWORD;   // DWORD
  hTemplateFile: THandle   // HANDLE optional
): THandle; stdcall;
  external 'api-ms-win-core-file-fromapp-l1-1-0.dll' name 'CreateFileFromAppW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CreateFileFromAppW"
  c_CreateFileFromAppW :: CWString -> Word32 -> Word32 -> Ptr () -> Word32 -> Word32 -> Ptr () -> IO (Ptr ())
-- lpFileName : LPCWSTR -> CWString
-- dwDesiredAccess : DWORD -> Word32
-- dwShareMode : DWORD -> Word32
-- lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> Ptr ()
-- dwCreationDisposition : DWORD -> Word32
-- dwFlagsAndAttributes : DWORD -> Word32
-- hTemplateFile : HANDLE optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let createfilefromappw =
  foreign "CreateFileFromAppW"
    ((ptr uint16_t) @-> uint32_t @-> uint32_t @-> (ptr void) @-> uint32_t @-> uint32_t @-> (ptr void) @-> returning (ptr void))
(* lpFileName : LPCWSTR -> (ptr uint16_t) *)
(* dwDesiredAccess : DWORD -> uint32_t *)
(* dwShareMode : DWORD -> uint32_t *)
(* lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> (ptr void) *)
(* dwCreationDisposition : DWORD -> uint32_t *)
(* dwFlagsAndAttributes : DWORD -> uint32_t *)
(* hTemplateFile : HANDLE optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library api-ms-win-core-file-fromapp-l1-1-0 (t "api-ms-win-core-file-fromapp-l1-1-0.dll"))
(cffi:use-foreign-library api-ms-win-core-file-fromapp-l1-1-0)

(cffi:defcfun ("CreateFileFromAppW" create-file-from-app-w :convention :stdcall) :pointer
  (lp-file-name (:string :encoding :utf-16le))   ; LPCWSTR
  (dw-desired-access :uint32)   ; DWORD
  (dw-share-mode :uint32)   ; DWORD
  (lp-security-attributes :pointer)   ; SECURITY_ATTRIBUTES* optional
  (dw-creation-disposition :uint32)   ; DWORD
  (dw-flags-and-attributes :uint32)   ; DWORD
  (h-template-file :pointer))   ; HANDLE optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CreateFileFromAppW = Win32::API::More->new('api-ms-win-core-file-fromapp-l1-1-0',
    'HANDLE CreateFileFromAppW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPVOID lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)');
# my $ret = $CreateFileFromAppW->Call($lpFileName, $dwDesiredAccess, $dwShareMode, $lpSecurityAttributes, $dwCreationDisposition, $dwFlagsAndAttributes, $hTemplateFile);
# lpFileName : LPCWSTR -> LPCWSTR
# dwDesiredAccess : DWORD -> DWORD
# dwShareMode : DWORD -> DWORD
# lpSecurityAttributes : SECURITY_ATTRIBUTES* optional -> LPVOID
# dwCreationDisposition : DWORD -> DWORD
# dwFlagsAndAttributes : DWORD -> DWORD
# hTemplateFile : HANDLE optional -> HANDLE
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型