添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关闭使用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;

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() 返回 0 GetLastError() 返回的错误代码为 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) ,关闭成功 !

学习用到了启动、 关闭 外部 进程 的知识,通过网上资料及自身实践作如下总结: 主要用到: ShellExecute () 、CreateProcess()、TerminateProcess()、OpenProcess()== 1. ShellExecute ( hWnd: HWND; {指定父窗口句柄} Operation: PChar; {指定动作, 譬如: open、runas、pr
最近做一个项目 使用 ShellExecute 打开 一个带参数的外部exe 文件 关闭 时遇到不少问题,最终解决,总结如下。   对于 关闭 ShellExecute 打开 进程 窗口,网上比较多的是用FindWindow方式,可惜我也不知道这窗口的名称,晕倒。通过查询资料找到以下方式可以 关闭 进程 。   // lpProcessName为 打开 进程 名称 带 文件 类型后缀 如:****... ShExecInfo.cbSize = sizeof( SHELLEXECUTE INFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = N 现在有一个MFC写的界面程序,以及一个外部exe 文件 。用户通过界面选择 文件 a,MFC将 文件 a的路径作为参数,调用exe 文件 生成一个解析 文件 b,然后MFC再读取这个 文件 b。 为了完成这一目的,就需要在MFC中调用外部exe 文件 ,我这里选用的是 ShellExecute 函数。 //function HINSTANCE ... 三个SDK函数: WinExec, ShellExecute ,CreateProcess C++ 枚举 进程 信息,并结束指定 进程 C/C++ Windows API——枚举 进程 、结束 进程 及提升权限 CreateProcess-Creating Processes The CreateProcess function creates a new process, which runs independently of the creating process. Howe
有三个API函数可以运行可执行 文件 WinExec、 ShellExecute 和CreateProcess。CreateProcess因为 使用 复杂,比较少用。 WinExec主要运行EXE 文件 。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW); ShellExecute 不仅可以运行EXE 文件 ,也可以运行已经关联的 文件 。 首先必须引用shellap
ShellExecute Ex是Windows API中的一个函数,用于在Windows系统中执行操作。要 使用 关闭 打开 的PDF阅读器,需要 使用 以下步骤: 使用 CreateProcess函数创建一个新的 进程 ,并获取该 进程 进程 句柄。 使用 ShellExecute Ex函数执行"taskkill"命令,并将上述 进程 句柄作为参数传入。该命令将终止 进程 SHELLEXECUTE INFO ...