WinAPIのMapViewOfFile
機能でこの状況に遭遇しました。インターネット検索で明らかな修正が得られなかったので、ここで問題と解決方法を共有します。MapViewOfFileがERROR_ACCESS_DENIEDで失敗するのはなぜですか?
const char *name = "Global\\Object_Name";
unsigned long size = get_object_size();
HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
size,
name);
if (!handle || handle == INVALID_HANDLE_VALUE)
exit(GetLastError());
bool created = GetLastError() == 0;
void *block = MapViewOfFile(handle,
FILE_MAP_ALL_ACCESS,
0,
0,
size);
if (block == NULL)
exit(GetLastError());
は、ある特定のケースでは、CreateFileMapping
が正常にハンドルを返していました:
は、次のスニペットを考えてみましょう。 GetLastError
はERROR_ALREADY_EXISTS
を返すので、created == false
です。今、に渡したのと同じサイズを使用してMapViewOfFile
を呼び出すと、NULL
とGetLastError
が返されます。0x05
:ERROR_ACCESS_DENIED
が返されます。プロセスは管理者権限で実行されていました。
MSDNのドキュメントでは、このような状況が発生する理由は実際には言及されていません。だからCreateFileMapping
は成功しますが、MapViewOfFile
は失敗しますか?