今ソフトウェアaを作成しています。
同じ実行ファイルaの同時起動を禁止しつつ、
『同じディレクトリに存在するリネーム済み実行ファイルa』、『違うディレクトリに存在する実行ファイルa』が同時起動できるようにしたいと考えています。
本で以下の方法を調べ、それをもとにいろいろ試してみたのですが、どうもうまくいきません。
どなたか方法を教えていただきたくよろしくお願いします。
csMutex="testkey";
AfxEnableControlContainer();
m_hMutex = CreateMutex(FALSE, 0, _T(csMutex));
// すでに起動しているか判定
if(GetLastError() == ERROR_ALREADY_EXISTS){ // すでに起動している。
MessageBox(NULL, "すでに起動しています。", "Multiplex starting prevention Test", MB_OK);
ReleaseMutex(m_hMutex);
CloseHandle(m_hMutex);
return FALSE;
}
「実行プログラムが同一のフルパス(同一ディレクトリ、同一EXE名)の場合のみ、2重起動の禁止を行いたい」ということでしたら、
以下のような方法はいかがでしょうか?
// 実行プログラムのフルパスをミューテックスオブジェクトの名前として取得する CString GetMutexModuleName() { CString strResult; TCHAR szModuleName[MAX_PATH]; // 実行プログラムのフルパスを取得 // 例)c:\home\edu\hatena\harunoharuno\1167532314\mutextest\Debug\mutextest.exe GetModuleFileName( NULL, szModuleName, MAX_PATH ); strResult = szModuleName; // 大文字・小文字のいずれかに統一する(ここでは大文字に統一) // 例)C:\HOME\EDU\HATENA\HARUNOHARUNO\1167532314\MUTEXTEST\DEBUG\MUTEXTEST.EXE strResult.MakeUpper(); // 円記号「¥」を別文字「/」に置き換える // 例)C:/HOME/EDU/HATENA/HARUNOHARUNO/1167532314/MUTEXTEST/DEBUG/MUTEXTEST.EXE strResult.Replace( _T("\\"), _T("/") ); return strResult; } BOOL CXxxxApp::InitInstance() { //CString csMutex="testkey"; CString csMutex = GetMutexModuleName(); // 実行プログラムが同一のフルパスの場合に2重起動の禁止を行う AfxEnableControlContainer(); m_hMutex = CreateMutex(FALSE, 0, (LPCTSTR)csMutex); // すでに起動しているか判定 if(GetLastError() == ERROR_ALREADY_EXISTS){ // すでに起動している。 MessageBox(NULL, "すでに起動しています。", "Multiplex starting prevention Test", MB_OK); ReleaseMutex(m_hMutex); CloseHandle(m_hMutex); return FALSE; } // 省略 }
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_APPmutex.html
回答ありがとうございます。教えていただいた方法で、思っていたどおりの動作を実装することができました。教えていただく前にフルパスを取得し、それをCreateMutexに渡すことは試したのですが、¥の/変換が必要だったんですね。勉強になります。