プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

MFCでアプリの2重起動を禁止する。

この記事は2019年03月29日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. MFCでアプリの2重起動を禁止する
  3. おわりに

標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング (Programmer’s SELECTION)

標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング (Programmer’s SELECTION)

  • 作者: ハーバートシルト,田中正造,Herbert Schildt,コスモワークス
  • 出版社/メーカー: 翔泳社
  • 発売日: 1999/04/01
  • メディア: 単行本
  • 購入: 11人 クリック: 39回
  • この商品を含むブログ (4件) を見る

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は行で使用しているMFCでアプリの2重起動を禁止する方法についてです。

目次へ

2. MFCでアプリの2重起動を禁止する

MFCでアプリの2重起動を禁止する方法ですが、Mutexを使って行います。

1回目起動した時にMutexを生成します。
2回目起動した時にもMutexを生成しますが、生成済みのためERROR_ALREADY_EXISTSエラーになります。
これによりアプリが2重起動したと判断します。

SampleApp.cpp

// Mutexを生成するときに使用する名前
// 今回はアプリのexe名にします。
#define EXE_NAME   _("SampleDlg.exe")

// Mutexのハンドル
// グローバル変数とします。
HANDLE g_hMutex = NULL;

/**
 * @brief インスタンスの初期化処理を行います。
 */
BOOL CSampleApp::InitInstance()
{
    CWinApp::InitInstance();
    ...

    // Mutexを生成します。
    g_hMutex = CreateMutex(NULL, TRUE, _T("SampleMultiActivate.exe"));

    // Mutexが生成済みの場合
    if (::GetLastError() == ERROR_ALREADY_EXISTS)
    {
        // 2重起動とみなします。
        SetLastError(NO_ERROR);
        CloseHandle(g_hMutex);
        AfxMessageBox(_T("このアプリは起動済みです。"));
        return FALSE;
   }
        ...
}

/**
 * @brief インスタンスの終了処理を行います。
 */
int CSampleApp::ExitInstance()
{
    ...
    // Mutexが有効な場合
    if (g_hMutex)
    {
        // Mutexを解放します。
        ReleaseMutex(g_hMutex);
        CloseHandle(g_hMutex);
        g_hMutex = NULL;
    }
    ...
    return CWinApp::ExitInstance();
}

目次へ

3. おわりに

今回作成しているアプリは2重起動は禁止でした。
そのため2重起動を禁止する処理を調査してみました。

今回はMFCのアプリで実装しましたが、CreateMutexはWin32 APIなので、Win32 APIのアプリにも適応できると思います。

完全無料でJavaを学ぶ0円スクール【0円スクール(完全無料のJavaスクール)】

かんたん Visual C++[改訂2版]

かんたん Visual C++[改訂2版]

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ