在App::InitInstance()中加入
CreateMutex(NULL,true,m_pszAppName)
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T("应用程序不可以重复启动"),MB_OK | MB_APPLMODAL | MB_ICONSTOP)
return(false)
}
把m_pszAppName换成程序的GUIDe值即可。一般在stdafx.h有,例如
#if !defined(AFX_STDAFX_H__A5EA48F2_0257_4B04_B771_A2E1635741D8__INCLUDED_)
#define AFX_STDAFX_H__A5EA48F2_0257_4B04_B771_A2E1635741D8__INCLUDED_
#if _MSC_VER >1000
#pragma once
#endif // _MSC_VER >1000
则GUID为:A5EA48F2_0257_4B04_B771_A2E1635741D8
这个值就是的程序ID,可定义为:
#define MY_GUID "{A5EA48F2_0257_4B04_B771_A2E1635741D8}"
然后把MY_GUID替换上面的m_pszAppName的即可。
凡动态分配了存储单元的变量,一旦不用,就要释放。例如动态数组,不管用new,还是 malloc分配的。就要 delete 或 free. 这点,你会注意的。
但MFC程序有些地方 动态分配存储单元 对程序员来说,不能“明显看出”。 由于MFC程序是事件驱动程序,有许多子程序(函数)是不断循环执行的。这些 不能“明显看出”的 动态分配,正因为不会自动释放, 才会引起泄漏。
例如 CView OnDraw()里,如果你 建了一个 font, "画" 完字,不用了,就要释放。
CFont font
font.CreateFontIndirect(&lf)// 这个过程隐含了分配
....
DeleteObject(font) // 不用了,就要释放
例如, 调色盘
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]
....
delete[] pLP// 不用了,就要释放
例如, 句柄
HANDLE hDIB = DDBToDIB( bitmap, BI_RGB, &pal )// 这个过程隐含了分配
....
GlobalFree( hDIB )// 不用了,就要释放
MFC程序比较复杂,你的泄漏是怎样引起的,要自己查找。上次有位提问的朋友,就是 CFont font泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)