AviUtlの多重起動を抑制するプラグイン
多重起動は抑制できるが、強制終了させているようなものなので、あまり良くないかも?
.aulは他のプラグインより先に読み込まれ、aで始まるように命名したため、一応は大丈夫かと。
リポジトリを作るのすら面倒なほどソースコードの記述量が少ないので、記事として。
後でリポジトリにあげるかもしれないが...
バイナリ
一応、使いたい人のためにバイナリだけは置いておく。自己責任でお使いください。
すべてのAviUtlの多重起動を抑制したい場合 (すべてのAviUtlにプラグインを導入する必要あり)
同一パスのAviUtlのみ多重起動を抑制したい場合
つかいかた
「antimulti.aul」を「aviutl.exe」と同一ディレクトリに配置
※同一ディレクトリに「antimulti.aul」「antimulti (1).aul」みたいな感じで複数置いてしまった場合、起動しなくなる。
つくりかた
1. 下の「antimulti.cpp」を「Shift-JIS」で保存
2. 「x86 Native Tools Command Prompt」を起動後、cppを保存したディレクトリをカレントディレクトリにし、以下のコマンドを用いてコンパイル
code:cmd
cl antimulti.cpp /Feantimulti.aul /LD
コードは以下
code:antimulti.cpp
static HANDLE hMutex = NULL;
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwNotification, LPVOID lpReserved) {
switch (dwNotification) {
case DLL_PROCESS_ATTACH: {
strcpy(szMutexName, "AviUtl_AntiMultiplexExec_Mutex");
// 同一パスのAviUtlのみ同時起動を抑制したい場合は以下のコメントアウトを外す
// GetModuleFileNameA(NULL, szMutexName, MAX_PATH * 2);
// for (char* p = szMutexName; *p; ++p) {
// if (*p == '\\' || *p == '/' || *p == ':') {
// *p = '_';
// }
// }
// Mutexを取得して、すでに起動しているか確認
hMutex = CreateMutex(NULL, TRUE, szMutexName);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
// すでに起動している場合は、Mutexを解放して強制終了
ReleaseMutex(hMutex);
CloseHandle(hMutex);
hMutex = NULL;
ExitProcess(1);
return FALSE;
}
// すでに起動していなかった場合
// DLLのロード時に自分自身をロードすることで、アンロードされないようにする
// 終了時にはちゃんとアンロードされるので大丈夫
GetModuleFileName(hInstance, szFileName, MAX_PATH);
LoadLibrary(szFileName);
break;
}
case DLL_PROCESS_DETACH: {
// DLLのアンロード時にMutexを解放
if (hMutex != NULL) {
ReleaseMutex(hMutex);
CloseHandle(hMutex);
}
break;
}
}
return TRUE;
}