作成したバッチやアプリが2個以上してしまうと思わぬ挙動になってしまうことがあるので、それをできないようにする方法となります
今回はC#とC++で実装しています
名前 | バージョン |
---|---|
OS | Windows 11 Pro |
C# | .Net 8.0 |
C#での多重起動制御
C#での実装は簡単でMutexクラスをバッチ等のMain関数内で宣言をするだけとなります
private static Mutex mutex;
void Main()
{
bool isExecute;
mutex = new Mutex(true, "<判別用の名前>", out isExecute);
try
{
// 二重起動をチェック
if (!isExecute)
{
// すでに起動されている場合猪尾処理(ログに書き出す、コンソールに表示する 等)
return;
}
//
// ここにメインとなる処理を実装
//
}
finally
{
// ミューテックスが取得されている場合にのみリリース
if (isExecute)
{
mutex.ReleaseMutex();
}
}
}
C++での多重起動制御
若干、書き方がややこしくなります。こちらはすでに起動済みの場合エラーを発生させています
#include <windows.h>
#include <locale.h>
#include <conio.h>
#include "iostream"
using namespace std;
HANDLE hMutex;
int main()
{
// Global\\をつけると同じPC上の他ユーザーも起動できなくなる
wchar_t* MUTEX_KEY = (wchar_t*)L"Global\\SampleMultiActivate.exe"; // キー名
// ミューテックが獲得されているかを調べる
hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, MUTEX_KEY);
if (hMutex != NULL)
{
throw("すでに別のプロセスで獲得されています。");
}
else
{
// ミューテックスを獲得する
hMutex = CreateMutex(NULL, FALSE, MUTEX_KEY);
if (::GetLastError() == ERROR_ALREADY_EXISTS)
{
cout << "すでに別のプロセスで獲得されています。" << endl;
}
else
{
cout << "ミューテックスを獲得しました。" << endl;
}
}
//
// ここにメインとなる処理を実装
//
// 獲得したミューテックスを開放する
if (hMutex != NULL)
{
::CloseHandle(hMutex);
}
}
最後に
これで多重起動を防ぐことができるようになります。M365系などは多重起動されると予期せぬことが起こりえないので、この処理を実装した方が良いと思いました
会社紹介
私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています
会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造
この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています
ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します
-
-
アドバンスド・ソリューション株式会社
アドバンスド・ソリューションは主にMicrosoft製品を使用して、企業の生産性向上に取り組んでいます。要件定義から導入 ...
サイトへ移動