在VC中,如何防止程序重复启动?

在VC中,如何防止程序重复启动?,第1张

一个vc的程序,由于使用了1394相机和串口资源,在多次运行时死机。

在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泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8093136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存