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