1. 禁止程序多开
常用程序退出方式:
(1)PostQuitMessage(0);//最常用
(2)PostMessage(WM_QUIT,0,0);//最常用
(3)::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0);//最常用
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0);//最常用
(4)ExitProcess(0);//注意使用时先释放分配的内存,以免造成内存泄露
(5)exit(0) ;//正常终止程序; exit(非0)非正常终止程序
(6)向主窗口发送WM_CLOSE消息SendMessage(WM_CLOSE);
(7)如果要在其它类关闭应用程序,则AfxGetMainWnd->SendMessage(WM_CLOSE);
而2,3,6,7均为程序已经启动时退出程序,4,5直接退出进程,需要释放相关内存分配,否则会造成不必要的内存泄露等问题,而1是先启动然后再退出。但是对于MFC程序都需要初始化,而单文档中有MainFrame,Doc,View和App等的初始化,经过调试发现最初调用的是App类,所以在App中进行判断是否打开和退出处理。
最先想到的是在构造函数中处理,尽可能早的判断,但是需要手动去处理内存问题,通过查Windows下return,exit和ExitProcess的区别和分析发现没必要去处理内存问题,直接交给MFC自己去处理,也就是尽可能使用return,而App类的初始化InitInstance()就通过返回的值来进行对应的处理,TRUE则会进行进一步的初始化(MainFrame,Doc,View),FALSE则系统会对建立的全局或局部变量自动进行析构调用和程序退出处理。
避免程序多开:
避免程序多开可以通过建立互斥量的方式,当再次打开时会建立相同的互斥量而发生错误,从而通过获取错误退出进行相关退出处理。
<span style="font-size:14px;"><span style="white-space:pre"> </span>// 避免重复打开 HANDLE hMutex = CreateMutex(NULL, FALSE, "CAD_Aplication"); //创建互斥体 if(GetLastError() == ERROR_ALREADY_EXISTS) { // 如果已有互斥量存在则释放句柄并复位互斥量 CloseHandle(hMutex); hMutex = NULL; AfxMessageBox("程序已经启动!"); // 程序退出 //exit(0); //ExitProcess(0); //PostQuitMessage(0);//会启动然后再关闭 return FALSE; }</span>
……