fAccess | ミューテックスオブジェクトの使用フラグ |
fInherit | 取得ハンドルが、継承可能かの真偽(FALSE/TRUE) |
sMutexName | オープンするミューテックスオブジェクト名 |
pSAttr | セキュリティ属性 |
fOwner | 作成時に所有権を取得するかの真偽(FALSE/TRUE) |
sMutexName | 作成するミューテックスオブジェクト名 |
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/ _/ //_/ Mutexサンプル<その1> _/ //_/ 赤字が、対象のコードです _/ //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #include<windows.h> HANDLE g_hMutex; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; MSG msg; WNDCLASS wc; HANDLE hPrevMutex; hPrevMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "MutexTestSample")); if(hPrevMutex) { MessageBox(NULL, "既に起動しています。", "起動中", MB_OK); CloseHandle(hPrevMutex); return FALSE; } g_hMutex = CreateMutex(FALSE, 0, "MutexTestSample"); if(!hPreInst) { wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "Window"; if (!RegisterClass(&wc)) return FALSE; } hWnd = CreateWindow( wc.lpszClassName, "Mutexサンプル", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } ReleaseMutex(g_hMutex); return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; } |
← グローバルに、ミューテックスハンドル宣言。 ← ミューテックステスト用のハンドル宣言。 ← ミューテックスハンドルを取得。 ← もし、ミューテックスのハンドルが取得できれば、 以前に、アプリケーションを起動していると言うことなので、 テストに使ったハンドルをクローズし、 WinMainに、FALSEを返し、アプリケーションを終了する。 ← ミューテックスハンドルを取得 "できなければ"、 ハンドルを作成する。 ← アプリケーション終了前に、ミューテックスハンドルをリリースする。 |
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/ _/ //_/ Mutexサンプル<その2> _/ //_/ 赤字が、対象のコードです _/ //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #include<windows.h> HANDLE g_hMutex; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; MSG msg; WNDCLASS wc; g_hMutex = CreateMutex(FALSE, 0, "MutexTestSample"); if(GetLastError() == ERROR_ALREADY_EXISTS) { MessageBox(NULL, "既に起動しています。", "起動中", MB_OK); return FALSE; } if(!hPreInst) { wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "Window"; if (!RegisterClass(&wc)) return FALSE; } hWnd = CreateWindow( wc.lpszClassName, "Mutexサンプル", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } ReleaseMutex(g_hMutex); CloseHandle(g_hMutex); return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; } |
← グローバルに、ミューテックスハンドル宣言。 ← ミューテックスハンドルを作成。 ← もし、GetLastError () から、 ERROR_ALREADY_EXISTS メッセージが返されたら 以前に、アプリケーションを起動していると言うことなので、 WinMainに、FALSEを返し、アプリケーションを終了する。 ← アプリケーション終了前に、ミューテックスハンドルをリリースする。 ← アプリケーション終了前に、ミューテックスハンドルをクローズする。 |