使用Win API确定可执行文件的实例是否已在运行

Mar*_*iam 3 c++ winapi

我需要确保只运行一个我的C++应用程序实例.

使用Win API我该怎么做;

  1. 检索有关我当前应用程序的信息? GetCurrentProcess()会给我一个处理我的应用程序,如何检索有关它的信息

  2. 检索用户的所有正在运行的进程的列表? EnumProcesses()给出一个列表,但似乎需要预先分配的缓冲区,那么如何找出当前正在运行的进程数?

  3. 我需要将我的服务器的exe名称与正在运行的进程进行比较,如果找到多个,则会引发错误

注意:我不能使用任何boost库,我对使用a感兴趣mutex,在类似的帖子中看到.

Fre*_*abe 9

您可以使用该CreateMutex函数创建系统范围的名为mutex,以表示您的进程是否正在运行.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;
 }
Run Code Online (Sandbox Code Playgroud)

现在,如果您坚持不使用互斥锁,则可以使用该CreateFile功能.确保通过零供dwShareMode领域获得独家访问语义,CREATE_NEWdwCreationDisposition场(这样你创建的文件只有当不存在的话),并FILE_FLAG_DELETE_ON_CLOSEdwFlagsAndAttributes参数,所以,一旦你的进程被终止的文件被删除.像这样的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

请参阅有关如何安全处理临时文件的临时文件生成和使用最佳实践的文章.

总而言之,肯定可以使用锁定文件来完成任务,但我认为这样做更难.