ディレクトリの識別子を取得する目的でdirectory handleを取得しようとしています。 (その上にリンクされている)文書は、CreateFile
関数にFILE_FLAG_BACKUP_SEMANTICS
フラグを渡す必要があることを指定して、ハンドル自体を取得します。CreateFile、FILE_FLAG_BACKUP_SEMANTICS、ディレクトリ管理とハンドル
はしかし、pinvoke'skernel32.dll
署名をコンサルティングで、ほとんどのC#の候補者は、次のようになります。C++ CreateFileへ
[DllImport("kernell32.dll", SetLastError = true)]
public static extern SafeFileHandle CreateFile(
string lpFileName,
[MarshalAs(UnmanagedType.U4)] FileAccess dwDesiredAccess,
[MarshalAs(UnmanagedType.U4)] FileShare dwShareMode,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode dwCreationDisposition,
[MarshalAs(UnmanagedType.U4)] FileAttributes dwFlagsAndAttributes,
IntPtr hTemplateFile
);
上記一対一のパラメータのマッピングはdwFlagsAndAttributes
パラメータがプレースホルダであることを意味しFILE_FLAG_BACKUP_SEMANTICS
の場合ただし、FileAttribute
列挙は、そのフラグに一致するように見えません。
は今(と、それが壊れています)私の呼び出しは次のようになります。
var createdFolder =
FileSystemInteractor.CreateFile(
fullPathWithFolderName,
FileAccess.Read,
FileShare.Read,
IntPtr.Zero,
FileMode.Open,
Kernel32.FILE_FLAG_BACKUP_SEMANTICS,
IntPtr.Zero
);
Kernel32
明らか権フラグが含まれています。コンパイラエラーが戻って受け取られます:
に「UINT」から変換することはできません「System.IO.FileAttributes」
エラーが理にかなっています。私はextern
の機能が初めてであるので、私ができる署名のマッサージを確信しています。
必要なフラグに対応するFileAttributes
はありますか? extern
の署名を変更する必要はありますか?
(FileAttributes)キャストを適用する以外に、パラメータを* uint *として簡単に宣言することができます。 –
@HansPassantは、extern署名がdllに解決する能力に影響しますか? – Thomas
いいえ、これはCの関数です。名前だけでエクスポートされ、パラメータタイプは何の役割も果たしません。 winapi関数に特有の呼び出し規約で飾られていなくても、単純な "CreateFile"です。 –