加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:24:56 所属栏目:百科 来源:网络整理
导读:我需要确保只运行我的C应用程序的一个实例. 使用Win API我该怎么做; 检索有关我当前申请的信息? GetCurrentProcess()将为我的应用程序提供一个HANDLE,如何检索有关它的信息 检索用户的所有正在运行的进程的列表? EnumProcesses()给出了一个列表,但似乎需要
我需要确保只运行我的C应用程序的一个实例.

使用Win API我该怎么做;

>检索有关我当前申请的信息?
GetCurrentProcess()将为我的应用程序提供一个HANDLE,如何检索有关它的信息
>检索用户的所有正在运行的进程的列表?
EnumProcesses()给出了一个列表,但似乎需要预先分配的缓冲区,那么如何找出当前正在运行的进程数?
>我需要将我的服务器的exe名称与正在运行的进程进行比较,如果找到多个,则会引发错误

注意:我不能使用任何增强库,我对使用互斥锁不感兴趣,在类似的帖子中看到.

解决方法

您可以使用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;
 }

现在,如果您坚持不使用互斥锁,则可以使用CreateFile功能.确保为dwShareMode字段传递零以获取独占访问语义,为dwCreationDisposition字段传递CREATE_NEW(以便仅在文件不存在时创建文件)和dwFlagsAndAttributes参数的FILE_FLAG_DELETE_ON_CLOSE传递,以便一旦您的文件被删除流程终止.像这样的东西:

LPCTSTR lockFileName = ...;
(void)::CreateFile( lockFileName,GENERIC_READ,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;
}

有关如何安全地处理临时文件,请参阅有关Temporary file generation and usage best practices的文章.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读