您可以使用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 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx函数代替。确保传递零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;
}
请参阅这篇文章了解临时文件生成和使用最佳实践 http://blogs.msdn.com/b/secureapps/archive/2007/01/23/temporary-file-best-practices.aspx关于如何安全地处理临时文件。
长话短说,当然可以使用锁定文件来完成您的任务,但我认为正确地做到这一点比较困难。