実行ファイルが起動しているかどうかの判定方法(開発環境VC,Windows2000)。

今ソフトウェア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;
}

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/12/31 11:31:56
  • 終了:2006/12/31 16:53:36

ベストアンサー

id:cx20 No.1

cx20回答回数607ベストアンサー獲得回数1082006/12/31 13:39:24

ポイント60pt

「実行プログラムが同一のフルパス(同一ディレクトリ、同一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

id:harunoharuno

回答ありがとうございます。教えていただいた方法で、思っていたどおりの動作を実装することができました。教えていただく前にフルパスを取得し、それをCreateMutexに渡すことは試したのですが、¥の/変換が必要だったんですね。勉強になります。

2006/12/31 14:53:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません