none
共有メモリ利用の際、「例外コード”0xc0000005”」が発生します。 RRS feed

  • 質問

  • 共有メモリ(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 全般 から
    2015年4月19日 21:06

回答

  • FILE_MAP_READ が何を意味するか、一度 MSDN を読み直しましょう。
    (pData->x = 0; という一文がある以上、FILE_MAP_READ では不足する)

    // 投稿先が TechNet フォーラム の Windows 7 全般となっていますが、MSDN フォーラム のカテゴリの方がふさわしい内容です
    // モデレーターの方が移動すると思いますので、次回以降はご注意ください。

    2015年4月19日 22:06
    モデレータ

すべての返信

  • FILE_MAP_READ が何を意味するか、一度 MSDN を読み直しましょう。
    (pData->x = 0; という一文がある以上、FILE_MAP_READ では不足する)

    // 投稿先が TechNet フォーラム の Windows 7 全般となっていますが、MSDN フォーラム のカテゴリの方がふさわしい内容です
    // モデレーターの方が移動すると思いますので、次回以降はご注意ください。

    2015年4月19日 22:06
    モデレータ
  • ブリュック さま よろしく。

    コンパイラは通っても実行しかねるものになっていると言う事ですね。 実行時のエラー。
    つまり、コードの部分部分自体は問題なくても、
    処理の流れが禁止事項(一般保護例外:アクセスできない領域に対するエラー)になっているので、
    もう一度、コードの組み立てを考え直しましょう と言われています。

    一般論として、以下のサイトが参考になるかと。
    意外と知られていない Windows のエラーコードの数々 エバンジェリスト 岩田雅樹 さまのブログ
    http://blogs.msdn.com/b/masaki/archive/2010/03/04/windows-error-code-types.aspx

    具体的な解決策の提示でなくて済みません。  Windows7 フォーラムへのご投稿でしたので、基本的な事を書きました。

    2015年4月20日 0:55
  • フォーラム オペレーターの星 睦美です。ブリュック さん、こんにちは。

    システム管理者向けのTechNet フォーラムに投稿されていますので、後ほどMSDNのVisual C++ フォーラムに移動させていただきますね。(もしフォーラムが質問内容に適当でない場合はお知らせください。)

    MSDN フォーラム > Visual Studio Development > Visual C++

    フォーラムで参考になる回答がありましたら、投稿者からの[回答としてマーク] をお願いします。

    フォーラムのご利用方法、ヘルプ、回答のガイドラインに関するお知らせ:


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年4月20日 1:30
  • フォーラム オペレーター 星 睦美様、かしこまりました。初めての利用でしたもので^^;

    2015年4月20日 4:24
  • エラーコードの読み方が参考になりました。ありがとうございます。

    投稿先については申し訳ないです(^^;)初めての利用でしたもので

    2015年4月20日 4:36
  • Azulean様

    書き込み権限(FILE_MAP_WRITE)の不足でした…

    再コンパイル後、正常起動できました。

    本当に助かりました。ありがとうございます。

    2015年4月20日 4:44