您可以使用该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;
}
请参阅这篇关于临时文件生成和使用最佳实践的文章,了解如何安全地处理临时文件。
长话短说,当然可以为您的任务使用锁定文件,但我认为正确执行此操作更难。