关闭使用ShellExecute打开的进程

关闭使用ShellExecute打开的进程

最近做一个项目使用到ShellExecute来打开一个带参数的外部exe文件,关闭时遇到不少问题,最终解决,总结如下。

对于关闭ShellExecute打开的进程窗口,网上比较多的是用FindWindow方式,可惜我也不知道这窗口的名称。通过查询资料找到以下方式可以关闭进程:

// lpProcessName为打开的进程名称 带文件类型后缀 如:****.exe

void CloseProcess(LPCTSTR lpProcessName);

{

 DWORD dwQQID = GetProcessID(lpProcessName);

 HANDLE hProecss = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwQQID); //打开进程

 if(hProecss)

{

 TerminateProcess(hProecss, 0); //关闭进程

}

CloseHandle(hProecss);

}

 

// 遍历进程,得到进程ID

DWORD GetProcessID(LPCTSTR lpProcessName)

{

    //创建进程快照

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if(hSnapshot != INVALID_HANDLE_VALUE)

    {

        PROCESSENTRY32 pe32 = {0};

        pe32.dwSize = sizeof(pe32);

        // 拿到第一个进程信息

        if(!Process32First(hSnapshot, &pe32))

        {

            CloseHandle(hSnapshot);

            return FALSE;

        }

        do 

        {

            int nLen = _tcslen(lpProcessName);

            int nLen2 = _tcslen(pe32.szExeFile);

            if(nLen != nLen2)

            {

                continue;

            }

            //if(_tcscmp(lower(lpProcessName), lower(pe32.szExeFile)) == 0)

            if(_tcscmp(lpProcessName, pe32.szExeFile) == 0)

            {

                return pe32.th32ProcessID;

            }

        } while (Process32Next(hSnapshot, &pe32));

    }

    return 0;

}

后来应用时发现在Win7系统关闭exe进程没有问题,但在winXP系统时关闭进程失败。

经测试是调用OpenProcess()返回0GetLastError()返回的错误代码为5,表示访问拒绝,权限不够!

BOOL ProcessPrivilege(BOOL bEnable)

{

 BOOL                   bResult = TRUE;

 HANDLE               hToken=INVALID_HANDLE_VALUE;

 TOKEN_PRIVILEGES     TokenPrivileges;

 if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,

&hToken) == 0)

{

   printf("OpenProcessToken Error: %d\n",GetLastError());

   bResult = FALSE;

}

TokenPrivileges.PrivilegeCount           = 1;

TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;

LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);

AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

if(GetLastError() != ERROR_SUCCESS)

{

    bResult = FALSE;

}

CloseHandle(hToken);

 

return bResult;

}

CloseProcess()函数的第一行加入ProcessPrivilege(TRUE),关闭成功!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值