2017-06-13 41 views
0

我正試圖從WP8遷移到C++擴展的通用Windows平臺。這些問題開始時我嘗試使用此代碼關於「NUL」的UWP CreateFile2 ERROR_ACCESS_DENIED

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

h爲-1,最後誤差爲5(ERROR_ACCESS_DENIED) 的CreateFile被重新定義這樣:

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); 
} 

此代碼的工作就Windows Phone 8,但不適用於Windows 10.所以,問題是 - 我做錯了什麼。

+1

您正在請求以獨佔模式打開文件(* dwShareMode *爲0)。這是故意的嗎?它是否也會以較不嚴厲的分享模式失敗? – IInspectable

+0

是的,如果我編寫FILE_SHARE_WRITE,或FILE_SHARE_READ或FILE_SHARE_WRITE | FILE_SHARE_READ。我認爲,這個問題隱藏在應用程序的某種權限中,但我根本沒有找到任何解決方案。 – Hramovnik

+0

根據[appx清單]中請求的功能(https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/appxmanifestschema/element-devicecapability)強烈檢查設備訪問。有點懷疑他們覆蓋了傳統的MS-Dos設備,但它值得一試。 –

回答

0

這裏有兩個問題。首先,因爲它是在CreateFile2 function描述:

當從Windows應用商店的應用程序調用,CreateFile2被簡化。您只能打開ApplicationData.LocalFolderPackage.InstalledLocation目錄中的文件或目錄。您無法打開命名管道或郵槽或創建加密文件(FILE_ATTRIBUTE_ENCRYPTED)。

因此,儘管在UWP使用CreateFile2功能,我們需要提供ApplicationData.LocalFolderPackage.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