このCreateMutex
関数を使用して、システム全体の名前付きミューテックスを作成し、プロセスが実行されているかどうかを示すことができます。ERROR_ALREADY_EXISTS
プロセスがすでに実行されている場合は、次のように返されます。
(void)::CreateMutex( NULL,
TRUE,
TEXT( "My_Special_Invokation_Test_Mutex" ) );
switch ( ::GetLastError() ) {
case ERROR_SUCCESS:
// Process was not running already
break;
case ERROR_ALREADY_EXISTS:
// Process is running already
break;
default:
// Error occured, not sure whether process is running already.
break;
}
ミューテックスを使用しないと主張する場合は、CreateFile
代わりに関数を使用できます。dwShareMode
排他的アクセス セマンティクスを取得するCREATE_NEW
ためのフィールド、dwCreationDisposition
フィールド (まだ存在しない場合にのみファイルを作成するため)、およびプロセスが終了するとファイルが削除されるようにFILE_FLAG_DELETE_ON_CLOSE
するためのdwFlagsAndAttributes
引数には、必ずゼロを渡してください。このようなもの:
LPCTSTR lockFileName = ...;
(void)::CreateFile( lockFileName,
GENERIC_READ,
0,
NULL,
CREATE_NEW,
FILE_FLAG_DELETE_ON_CLOSE,
NULL );
switch ( ::GetLastError() ) {
case ERROR_SUCCESS:
// Process was not running already
break;
case ERROR_FILE_EXISTS:
// Process is running already
break;
default:
// Error occured, not sure whether process is running already.
break;
}
一時ファイルを安全に処理する方法については、一時ファイルの生成と使用に関するベスト プラクティスに関するこの記事を参照してください。
簡単に言うと、タスクにロック ファイルを使用することは確かに可能ですが、正しく行うのは難しいと思います。