トップ回答者
共有メモリ利用の際、「例外コード”0xc0000005”」が発生します。

質問
-
共有メモリ(CreateFileMapping)を用いたアプリケーションの作成中になります。
コンパイルは問題なくできたのでコンパイルしたexeファイルを起動しますが起動できず困っています。
イベントビューアーには”例外コード: 0xc0000005”のエラーが出ていました。
ソースコード(C言語)は以下になります。
#include <windows.h> #define BUTTON_1 0 #define BUTTON_2 1 #define MUTEX_NAME "MutexObject" typedef struct { int x; } SHARED_DATA; HANDLE hMap; /* ファイルマッピングオブジェクトのハンドル */ HANDLE hMutex = NULL; /* 共有データへの排他アクセス用ミューテックスオブジェクトのハンドル */ SHARED_DATA CurrentData, *pData; /* 共有するデータ */ BOOL bAlreadyExists; /* 既にファイルマッピングオブジェクトが作成されているかどうかを表す真偽値 */ LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { switch (msg) { case WM_DESTROY: MessageBox(hwnd , TEXT("終了します") , TEXT("PracticeMain[終了]") , MB_ICONINFORMATION); if(!CloseHandle(hMutex)){ MessageBox(hwnd , TEXT("ミューテックスオブジェクトのクローズに失敗") , TEXT("PracticeMain[終了]@ミューテックス") , MB_ICONINFORMATION); } if(!UnmapViewOfFile(pData)){ MessageBox(hwnd , TEXT("共有メモリビューファイルのクローズに失敗") , TEXT("PracticeMain[終了]@ビューファイル") , MB_ICONINFORMATION); } if(!CloseHandle(hMap)){ MessageBox(hwnd , TEXT("ファイルマッピングオブジェクトのクローズに失敗") , TEXT("PracticeMain[終了]@ビューファイル") , MB_ICONINFORMATION); } PostQuitMessage(0); return 0; case WM_COMMAND: switch(LOWORD(wp)) { case BUTTON_1: /* シグナル状態になるまで待つ。 */ WaitForSingleObject(hMutex,INFINITE); pData->x = -1; CurrentData = *pData; ReleaseMutex(hMutex); break; case BUTTON_2: /* シグナル状態になるまで待つ。 */ WaitForSingleObject(hMutex,INFINITE); pData->x = 1; CurrentData = *pData; ReleaseMutex(hMutex); break; } return 0; } return DefWindowProc(hwnd , msg , wp , lp); } int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { HWND hwnd; MSG msg; WNDCLASS winc; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); winc.hCursor = LoadCursor(NULL , IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("PracticeMainWindow"); if (!RegisterClass(&winc)){ MessageBox(NULL, TEXT("WNDCLASS構造体の初期化に失敗") , TEXT("WNDCLASS構造体の初期化に失敗") , MB_ICONINFORMATION); return 0; } /* 排他制御用ミューテックスオブジェクト作成 */ hMutex = CreateMutex(NULL, FALSE, MUTEX_NAME); /* ファイルマッピングオブジェクトの作成 */ //hMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE | SEC_COMMIT, 0, sizeof(SHARED_DATA), TEXT("PracFX")); hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(SHARED_DATA), TEXT("PracFX")); /* 既に作成されていたかどうかの確認 */ bAlreadyExists = (GetLastError() == ERROR_ALREADY_EXISTS); /* ビューの作成 */ pData = (SHARED_DATA *)MapViewOfFile(hMap , FILE_MAP_READ , 0 , 0 , sizeof(SHARED_DATA)); /* 新規に作成された場合、共有データの初期化を行う */ if(!bAlreadyExists) { pData->x = 0; } /* メインウインドウ */ hwnd = CreateWindow( TEXT("PracticeMainWindow"), TEXT("PracticeMain"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); /* ボタン1 */ CreateWindow( TEXT("BUTTON") , TEXT("SELL") , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 0 , 0 , 100 , 50 , hwnd , (HMENU)BUTTON_1 , hInstance , NULL ); /* ボタン2 */ CreateWindow( TEXT("BUTTON") , TEXT("BUY") , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 120 , 0 , 100 , 50 , hwnd , (HMENU)BUTTON_2 , hInstance , NULL ); if (hwnd == NULL) return 0; while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg); return msg.wParam; }
よろしければどなたかご教示いただけますでしょうか。
- 移動 星 睦美 2015年4月20日 5:27 TechNet - Windows 7 全般 から
回答
すべての返信
-
ブリュック さま よろしく。
コンパイラは通っても実行しかねるものになっていると言う事ですね。 実行時のエラー。
つまり、コードの部分部分自体は問題なくても、
処理の流れが禁止事項(一般保護例外:アクセスできない領域に対するエラー)になっているので、
もう一度、コードの組み立てを考え直しましょう と言われています。
一般論として、以下のサイトが参考になるかと。
意外と知られていない Windows のエラーコードの数々 エバンジェリスト 岩田雅樹 さまのブログ
http://blogs.msdn.com/b/masaki/archive/2010/03/04/windows-error-code-types.aspx具体的な解決策の提示でなくて済みません。 Windows7 フォーラムへのご投稿でしたので、基本的な事を書きました。
-
フォーラム オペレーターの星 睦美です。ブリュック さん、こんにちは。
システム管理者向けのTechNet フォーラムに投稿されていますので、後ほどMSDNのVisual C++ フォーラムに移動させていただきますね。(もしフォーラムが質問内容に適当でない場合はお知らせください。)
・MSDN フォーラム > Visual Studio Development > Visual C++
フォーラムで参考になる回答がありましたら、投稿者からの[回答としてマーク] をお願いします。
・フォーラムのご利用方法、ヘルプ、回答のガイドラインに関するお知らせ:
フォーラム オペレーター 星 睦美 - MSDN Community Support