高分请教:内存泄漏问题
我在OnTimer里每三秒执行一次下面的ShowState函数来判断一个服务程序的状态(启动类型,状态),
在任务管理器中这个进程大约每隔10秒总会增加4k的内存,在debug模式下,
没有发现内存泄漏,如果把OnTimer中的ShowState();去掉,不会出现增加4k内存的情况
问题是:ShowState为什么会这样,那段代码为什么会不断增加4k的内存 要怎么改正 ?
代码如下:
void CARServerCtrlDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
ShowState();
CDialog::OnTimer(nIDEvent);
}
void CARServerCtrlDlg::ShowState()
{
DWORD dwState=0;//xFFFFFFFF;
DWORD dwStartType=0;//xFFFFFFFF;
DWORD dwErr=0;//xFFFFFFFF;
// open the service control manager
SC_HANDLE hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
ASSERT(hSCM);
// open the service
SC_HANDLE hService=OpenService(hSCM,SERVICENAME,SERVICE_ALL_ACCESS);
if (hService)
{
// Get the current status
SERVICE_STATUS m_ServiceState;
memset(&m_ServiceState,0,sizeof(m_ServiceState));
LPQUERY_SERVICE_CONFIG m_pQSC;
memset(&m_pQSC,0,sizeof(m_pQSC));
DWORD dwSize;
m_pQSC=(LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR,1024);
if (!QueryServiceStatus(hService,&m_ServiceState)||!QueryServiceConfig(hService,m_pQSC,1024,&dwSize))
{
dwErr=GetLastError();
ASSERT(0);
}
else
{
dwErr=m_ServiceState.dwWin32ExitCode;
dwState=m_ServiceState.dwCurrentState;
DWORD dwStartType=m_pQSC->dwStartType;
switch(dwStartType)
{
case SERVICE_DISABLED:
((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(2);
break;
case SERVICE_DEMAND_START:
((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(1);
break;
default:
((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(0);
}
// if the service is running,send a control request
// to get its current status.
if (dwState==SERVICE_RUNNING)
{
if (::ControlService(hService,SERVICE_CONTROL_INTERROGATE,&m_ServiceState))
{
dwErr=m_ServiceState.dwWin32ExitCode;
dwState=m_ServiceState.dwCurrentState;
}
}
}
//close the service handle
CloseServiceHandle(hService);
hService=NULL;
}
// close the service control manager handle
CloseServiceHandle(hSCM);
hSCM=NULL;
//
char buf[64];
switch(dwState)
{
case SERVICE_RUNNING:
strcpy(buf,"正在运行 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(TRUE);
GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_BROWSER)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);
m_State=state_runing;
break;
case SERVICE_PAUSED:
strcpy(buf,"已暂停 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);
m_State=state_none;
break;
case SERVICE_STOPPED:
strcpy(buf,"已停止 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_BROWSER)->EnableWindow(TRUE);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);
m_State=state_stop;
break;
case SERVICE_START_PENDING:
strcpy(buf,"正在启动 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);
m_State=state_none;
break;
case SERVICE_STOP_PENDING:
strcpy(buf,"正在停止 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);
m_State=state_none;
break;
case SERVICE_CONTINUE_PENDING:
strcpy(buf,"正在继续 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);
m_State=state_none;
break;
case SERVICE_PAUSE_PENDING:
strcpy(buf,"正在暂停 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);
m_State=state_none;
break;
default:
strcpy(buf,"未安装 - Online services");
SetDlgItemText(IDC_BTN_SETUP,_T("安装服务"));
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);
((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(0);
GetDlgItem(IDC_STARTTYPE)->EnableWindow(FALSE);
m_State=state_none;
}
// 显示在状态栏
m_wndStatusBar.SetPaneText(0,buf);
// 显示在托盘的tip
lstrcpyn(m_Notify.szTip,buf,sizeof(m_Notify.szTip));
Shell_NotifyIcon(NIM_MODIFY,&m_Notify);
}