BOOL KillProcessFromName(CString strProcessName)
{
//创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//PROCESSENTRY32进程快照的结构体
PROCESSENTRY32 pe;
//实例化后使用Process32First获取第一个快照的进程前必做的初始化 *** 作
pedwSize = sizeof(PROCESSENTRY32);
//下面的IF效果同:
//if(hProcessSnap == INVALID_HANDLE_VALUE) 无效的句柄
if(!Process32First(hSnapShot,&pe))
{
return FALSE;
}
//将字符串转换为小写
strProcessNameMakeLower();
//如果句柄有效 则一直获取下一个句柄循环下去
while (Process32Next(hSnapShot,&pe))
{
//peszExeFile获取当前进程的可执行文件名称
CString scTmp = peszExeFile;
//将可执行文件名称所有英文字母修改为小写
scTmpMakeLower();
//比较当前进程的可执行文件名称和传递进来的文件名称是否相同
//相同的话Compare返回0
if(!scTmpCompare(strProcessName))
{
//从快照进程中获取该进程的PID(即任务管理器中的PID)
DWORD dwProcessID = peth32ProcessID;
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
::TerminateProcess(hProcess,0);
CloseHandle(hProcess);
return TRUE;
}
scTmpReleaseBuffer();
}
strProcessNameReleaseBuffer();
return FALSE;
}
右键点建立类向导,d出如图对话框:
选WM_CLOSE或DestroyWindow(二者区别请上网搜索),点AddFunction,类向导会自动给你添加成员函数,在Member
functions里选择刚才的成员函数,进入代码编辑,加入你杀死线程的代码。
完全可以做到,如果是对话框程序,我们可以在this->OnOk()之前调用
if(MessageBox(_T("确定退出程序么"), "message", MB_YESNO|MB_ICONQUESTION))
{
this->OnOk();
}
具体你在哪退出程序,有你自己决定,可以是对话框上面做个一个退出按钮,该按钮事件里面响应也可以。
也可以在右上角关闭里面响应也可以!
你检查一下,在程序的某个地方,是不是在清除内存(删除对象)时,删除了不存在的对象;或者,对无效的指针(对象)变量进行了 *** 作。
因为,在不同的电脑环境下,有些指针(或变量)会无效。
对于CheckBytes函数,你重点检查char pb是否有效。
1、有比较大的是越界 *** 作导致栈堆破坏,异常了并不一定会d个框才退出,直接退出也是有调试运行。
2、另外还有一种情况,缺少初始化控件函数,诸如AfxInitOle之类的问题。也会出现这情况的。
程序的启动和退出是要讲究顺序的,实则就是一个栈式的过程,比如你启动一个SDI程序或者MDI程序,先启动APP,再分别启动MainFrm,ChildFrm,以及View。这几者之间是有相互依赖关系的。可以想象,当你要退出一个程序时,你得反过来分别退出View,ChildFrm,MainFrm,最后才是App。
所以,你在View里使用DestroyWindow()导致这种顺序打乱了,所以才出现程序崩溃的错误。
给你补补吧,MDI程序退出顺序如下:
1、当框架CFrameWnd关闭时,会接收到WM_CLOSE消息,通过消息映射会执行OnClose方法;
2、在OnClose方法中,由于框架是应用程序的主窗口,因此会调用应用程序的CloseAllDocuments方法;
3、应用程序的CloseAllDocuments调用了文档管理器的CloseAllDocuments方法;
4、文档管理器的CloseAllDocuments方法调用了文档模板的CloseAllDocuments方法;
5、在文档模板的CloseAllDocuments方法中,调用了文档的OnCloseDocument方法;
6、在文档对象的OnCloseDocument方法中,调用了框架的DestroyWindow方法,而框架的DestroyWindow方法直接调用了CWnd的DestroyWindow方法释放窗口;
7、在窗口类CWnd的DestroyWindow方法中,调用了API函数DestroyWindow释放窗口。该函数会向窗口发送WM_DESTROY消息,执行视图类的OnDestroy方法,接着释放掉视图窗口,在视图窗口被释放后,向视图窗口发送最后一个窗口消息WM_NCDESTROY,执行视图的PostNcDestroy方法;
8、PostNcDestroy方法中的“delete this;”最终会调用视图的析构函数释放掉视图对象。
通过以上可知,过早地执行DestroyWindow违反了这一顺序;利用楼上所述,使用AfxGetMainWnd()->SendMessage(WM_CLOSE); 就应该不会有问题了。
以上就是关于mfc如何彻底退出进程全部的内容,包括:mfc如何彻底退出进程、MFC 如何在退出时执行某段代码、mfc 退出的程序是在哪里响应的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)