2017-06-13 1 views
0

私は、古いものをWP8からC++エクステンションでUniversal Windows Platformに移行しようとしています。UWP CreateFile2 ERROR_ACCESS_DENIED on "NUL"

HANDLE CreateFile(
_In_ LPCWSTR lpFileName, 
_In_ DWORD dwDesiredAccess, 
_In_ DWORD dwShareMode, 
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
_In_ DWORD dwCreationDisposition, 
_In_ DWORD dwFlagsAndAttributes, 
_In_opt_ HANDLE hTemplateFile 
) 
{ 
    CREATEFILE2_EXTENDED_PARAMETERS extendedParameters; 
    extendedParameters.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); 
    extendedParameters.dwFileAttributes = dwFlagsAndAttributes & 0x0003FFF7; 
    extendedParameters.dwFileFlags = dwFlagsAndAttributes & 0xFF3C0000; 
    extendedParameters.dwSecurityQosFlags = SECURITY_ANONYMOUS; 
    extendedParameters.lpSecurityAttributes = lpSecurityAttributes; 
    extendedParameters.hTemplateFile = hTemplateFile; 
    return CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, 
dwCreationDisposition, &extendedParameters); 
} 

このコードは、上の作品:私はこのコードを使用しようとしているときに問題は時間が-1で、そして最後のエラーは5(ERROR_ACCESS_DENIED) のCreateFileは、そのように再定義されている

HANDLE h = CreateFile(L"NUL", 0, 0, NULL, OPEN_ALWAYS, 0, NULL); 

を開始しますWindows Phone 8で動作しますが、Windows 10では動作しません。したがって、問題は - 私は間違っています。

+1

ファイルを排他モードで開くことを要求しています(* dwShareMode *は0です)。これは意図的ですか?それはまた、より厳格ではない共有モードでも失敗しますか? – IInspectable

+0

これは、FILE_SHARE_WRITE、FILE_SHARE_READ、またはFILE_SHARE_WRITEを書いても同じことです。 FILE_SHARE_READ。私は、問題はアプリケーションの許可の中に隠されていると思いますが、私は全く解決策を見いだせませんでした。 – Hramovnik

+0

デバイスアクセスは、[the appx manifest](https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/appxmanifestschema/element-devicecapability)で要求された機能と強く比較されます。 MS-DOSのレガシーデバイスをカバーするかどうかは疑問だが、それは良いことだ。 –

答えて

0

ここには2つの問題があります。それはCreateFile2 functionに記載されているように、まず、:

Windowsストアアプリから呼び出された場合、CreateFile2が簡略化されます。 ApplicationData.LocalFolderまたはPackage.InstalledLocationディレクトリ内のファイルまたはディレクトリのみを開くことができます。名前付きパイプまたはメールスロットを開いたり、暗号化されたファイルを作成することはできません(FILE_ATTRIBUTE_ENCRYPTED)。

だから、UWPにCreateFile2機能を使用している間、私たちはApplicationData.LocalFolderまたはPackage.InstalledLocationディレクトリ内のパスを提供する必要がありますようlpFileNameパラメータだけではなく、ファイル名として:

Windows::Storage::StorageFolder^ localFolder = Windows::Storage::ApplicationData::Current->LocalFolder; 
String^ path = localFolder->Path; 
path += L"\\Test.txt"; 

CREATEFILE2_EXTENDED_PARAMETERS extendedParams; 
extendedParams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); 
extendedParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL; 
extendedParams.dwFileFlags = FILE_FLAG_SEQUENTIAL_SCAN; 
extendedParams.dwSecurityQosFlags = SECURITY_ANONYMOUS; 
extendedParams.lpSecurityAttributes = NULL; 
extendedParams.hTemplateFile = NULL; 

HANDLE fileHandle = CreateFile2(path->Data(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_ALWAYS, &extendedParams); 

もう一つはということですファイル名としてNULを使用することはできません。 Naming Files, Paths, and Namespacesを参照してください:

ファイルの名前について、次の予約名は使用しないでください。

CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7をCOM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、およびLPT9を含む。
これらの名前の直後には拡張子を付けないでください。たとえば、NUL.txtはお勧めしません。詳細については、Namespacesを参照してください。

したがって、次のようにコードを変更してもエラーは発生しません。

Windows::Storage::StorageFolder^ localFolder = Windows::Storage::ApplicationData::Current->LocalFolder; 
String^ path = localFolder->Path; 
path += L"\\Test.txt"; //Replace with the name you want to use. 

HANDLE h = CreateFile(path->Data(), 0, 0, NULL, OPEN_ALWAYS, 0, NULL); 
+0

問題は、 "NUL"にファイルを作成する必要があることです。しかし、おかげさまで、あなたの情報は役立ちます。 – Hramovnik

関連する問題