현재 512MB 에뮬레이터에서 테스트 중입니다.내 readfile은 디버그 모드에서 작동하지만 릴리스 모드에서는 작동하지 않습니다. 무슨 일있어?
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). 여기서 End of File 오류가 발생하는 것은 확실합니다. 액세스하는 파일은 프로젝트의 일부이며 구성 속성에서 build : NO (이 설정으로 두 가지 방법을 시도했습니다), Content : YES (이 옵션을 yes로 설정하면 디버그를 만드는 데 중요했습니다. 모드 작업) 및 항목 유형 : 빌드에 참여하지 않습니다 (이 설정에 영향을주지 않았습니다).
릴리스 모드가 디버그 모드와 일관되게 동작하도록하려면 어떻게해야합니까 (이 경우 성공적으로 파일을 수행합니까?).
이것은 C++가 아니며 일부 언어 (아마도 C++/CLI)입니다. 이에 따라 다시 태그하십시오. –
C++/CLI가 아니며 Windows Phone에서는 지원되지 않습니다. 그러나 요령이 찍혔습니다. – MNagy
winapi 코드에서 흔히 발생하는 일반적인 깨진 오류 처리처럼 보입니다. winapi 함수가 실제로 실패하지 않았을 때 GetLastError() 값을 표시하면 임의의 숫자가 생성됩니다. –