-1

當前正在512 MB模擬器上進行測試。我有下面的代碼,在調試模式下正常執行:我的讀取文件正在調試模式下工作,但不是釋放模式。出了什麼問題?

StorageFolder^ appFolder = Windows::ApplicationModel::Package::Current->InstalledLocation; 

String^ path = appFolder->Path; 

std::wstring testFileName = std::wstring(path->Begin(), path->End()) + std::wstring(L"\\full-R23-0000000000000000Mapped"); 

_CREATEFILE2_EXTENDED_PARAMETERS extend = { 0 }; 
extend.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); 
extend.dwFileAttributes = FILE_ATTRIBUTE_NORMAL; 
extend.dwFileFlags = FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED; 
extend.dwSecurityQosFlags = SECURITY_ANONYMOUS; 
extend.lpSecurityAttributes = nullptr; 
extend.hTemplateFile = nullptr; 

HANDLE dataFile = CreateFile2(
    testFileName.c_str(), 
    GENERIC_READ | GENERIC_WRITE, 
    0, 
    OPEN_ALWAYS, 
    &extend); 

DWORD errcode = GetLastError(); 
OutputDebugString(L" Error Code: "); 
OutputDebugString(std::to_wstring(errcode).c_str()); 

OVERLAPPED positionalData = { 0 }; 
positionalData.Offset = 0; 
positionalData.OffsetHigh = 0; 
positionalData.hEvent = 0; 


byte* cacheTest = reinterpret_cast<byte*>(VirtualAlloc(
    NULL, 
    datasetReadSectorSize, 
    MEM_COMMIT | MEM_RESERVE, 
    PAGE_READWRITE)); 

bool readsuccess = ReadFile(
    dataFile, 
    &cacheTest[0], 
    datasetReadSectorSize, 
    NULL, 
    &positionalData); 

DWORD errcode2 = GetLastError(); 
OutputDebugString(L" Error Code 2: "); 
OutputDebugString(std::to_wstring(errcode2).c_str()); 

DWORD temp_sector_size = datasetReadSectorSize; 

GetOverlappedResult(
    dataFile, 
    &positionalData, 
    &temp_sector_size, 
    true); 

但是,此代碼掛起在釋放模式的最後GetOverlappedResult命令。在調試模式下,它給出的錯誤代碼分別爲183和997(分別爲ERROR_ALREADY_EXISTS和ERROR_IO_PENDING),這兩者都不是問題。在發佈模式下,它給出的錯誤代碼分別爲183和38(分別爲ERROR_ALREADY_EXISTS和ERROR_HANDLE_EOF)。它在這裏得到一個文件結束錯誤當然讓我感到困惑。它正在訪問的文件是該項目的一部分,並且在其配置屬性中,它被設置爲從構建中排除:NO(我已經嘗試了這種設置),Content:YES(將其設置爲yes對於進行調試非常重要模式工作)和項目類型:不參與構建(我沒有觸及這個設置)。

如何使釋放模式與調試模式一致(在這種情況下,成功執行文件)?

+1

這不是C++,而是一些方言(可能是C++/CLI)。請相應地重新標記。 –

+0

它不是C++/CLI,在Windows Phone上不支持。不過,要點。 – MNagy

+1

看起來像在winapi代碼中很常見的傳統錯誤處理。當winapi函數沒有真正失敗時顯示GetLastError()的值會產生一個隨機數。 –

回答

0

好吧,這很尷尬,因爲答案很簡單。當我添加我正在讀取的文件(我在調試版本中添加它時),編輯屬性頁面時,我從未將配置屬性從「調試」更改爲「所有配置」。改變這個解決了我的問題,現在ReadFile在發佈模式下工作,就像在調試模式下一樣。

我一直在咆哮這麼多錯誤的樹木。

相關問題