如果杀死一个进程

toball 2003-12-16 11:18:36
我不知道该怎么用这个函数TerminateProcess()
来杀死进程,能给个示例代码看看吗
...全文
54 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohedou 2003-12-16
  • 打赏
  • 举报
回复
这样:IsAppRun("notepad.exe");//杀死notepad.exe

BOOL CMyGoodsDlg::IsAppRun(PTCHAR AppName)
{
TCHAR pPath[_MAX_PATH];
pPath[0]=0;
_searchenv(AppName,"PATH",pPath);
VERIFY(pPath);
DWORD id=GetCurrentProcessID();//当前进程
id=GetProcessIDFromName(AppName);//这样查杀AppName
if(id!=NULL)
{
HANDLE myhandle=OpenProcess(PROCESS_ALL_ACCESS,TRUE,id);
DWORD exitcode=0;
TerminateProcess(myhandle,exitcode);
return TRUE;
}
return FALSE;
}
//这个函数按名字查找ID
DWORD CMyGoodsDlg::GetProcessIdFromName(LPCTSTR name)
{
PROCESSENTRY32 pe;
DWORD id = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hSnapshot,&pe) )
return 0;
CString name1,name2;
do
{
pe.dwSize = sizeof(PROCESSENTRY32);
if( Process32Next(hSnapshot,&pe)==FALSE )
break;
name1=pe.szExeFile;
name2=name;
name1.MakeUpper();
name2.MakeUpper();
if(strcmp(name1.GetBuffer(0),name2.GetBuffer(0)) == 0)
{
id = pe.th32ProcessID;
break;
}
} while(1);
CloseHandle(hSnapshot);
return id;
}
sboom 2003-12-16
  • 打赏
  • 举报
回复
当然要先得到进程句柄啦,然后句柄做TerminateProcess()的参数。
handsomerun 2003-12-16
  • 打赏
  • 举报
回复
你干什么要自己杀死它呢
 线程函数结束了,线程自己也就退出了
 你在线程函数里让函数返回就可以了
 控制线程函数结束的方法也很多,比如用Event对象
toball 2003-12-16
  • 打赏
  • 举报
回复
我的情况是这样的
我有个程序正在运行
现在有新版本,要升级他,
所以要先关闭当前程序,
才能让新文件覆盖它
toball 2003-12-16
  • 打赏
  • 举报
回复
我看了半天
还是不知道具体该怎么写
我觉得关闭一个进程应该没这么复杂吧
yifengling0 2003-12-16
  • 打赏
  • 举报
回复
首先, 调用 CreateToolhelp32Snapshot() 获得当前运行进程的快照,这个函数返回包含正在运行进程的快照句柄。其原形是:

HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);

其中:
dwFlags表示要包含在快照的内容为TH32CS_SNAPPROCESS表示在快照中包含进程列表;
th32ProcessID是进程号,为0表示当前进程。
返回值是一个句柄,如果没有进程正在运行,则返回INVALID_HANDLE_VALUE(可用GetLastError()获得),反之可用BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);获取返回的进程
如果Process32First返回TRUE,则第一个进程的信息已经在LPPROCESSENTRY32结构中,其余进程信息可用BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)获得
LPPROCESSENTRY32结构的定义如下: typedef struct tagPROCESSENTRY32 {
DWORD dwSize; //此结构的大小
DWORD cntUsage; //进程的引用数,如果为0,则次进程已停止
DWORD th32ProcessID; //进程号
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; //此进程引用的模块ID
DWORD cntThreads; //此进程创建的线程数
DWORD th32ParentProcessID; //父进程的ID
LONG pcPriClassBase; //这个进程创建的线程的基本优先权
DWORD dwFlags; //保留
TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;
最后不要忘了调用: CloseHandle();
另用函数是: HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process identifier
);
用它可打开一个进程,打开进程后,可用: BOOL TerminateProcess(
HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);
来关闭进程。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧