|
Hello,
Using processList in debug mode I discover many memory leak
After analys it appears to come from all pointer from new CModuleDetails and new CEnumProcessList which are not deleted properly.
So I change as following :
CProcessListDlg.h : Add
public:
~CProcessListDlg();
private:
CTypedPtrList <CObList,CModuleDetails*> m_PtrModuleDetailsList;
CList<CEnumProcessList*, CEnumProcessList*> m_PtrEnumProcessList;
CProcessListDlg.cpp : Add
CProcessListDlg::~CProcessListDlg()
{
TRACE0("~CProcessListDlg()\n" );
int iNb1 = m_PtrModuleDetailsList.GetCount();
CString sNb1 = _T("");
sNb1.Format(_T("%i"), iNb1);
TRACE0("~CProcessListDlg() : m_PtrModuleDetailsList.GetCount()=" + sNb1 + "\n" );
while (!m_PtrModuleDetailsList.IsEmpty())
{
delete m_PtrModuleDetailsList.GetHead();
m_PtrModuleDetailsList.RemoveHead();
}
int iNb2 = m_PtrEnumProcessList.GetCount();
CString sNb2 = _T("");
sNb2.Format(_T("%i"), iNb2);
TRACE0("~CProcessListDlg() : m_ModulesList.GetCount()=" + sNb2 + "\n" );
while (!m_PtrEnumProcessList.IsEmpty())
{
delete m_PtrEnumProcessList.GetHead();
m_PtrEnumProcessList.RemoveHead();
}
}
CProcessListDlg.cpp : change :
void CProcessListDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult)
{
m_ListCtrl.DeleteAllItems();
pCtrl.SetRedraw(FALSE);
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CModuleDetails *pModuleInfo = reinterpret_cast<CModuleDetails *> (pCtrl.GetItemData( pNMTreeView->itemNew.hItem ));
CString strText;
if(pModuleInfo)
{
CEnumProcessList * m_listp = new CEnumProcessList(pModuleInfo->pProcessID);
m_PtrEnumProcessList.AddTail(m_listp);
if ( m_listp->Get_m_hProcess() != NULL )
{
for(POSITION modulePos1 = m_listp->GetHeadPosition(); modulePos1 != NULL;)
{
CModuleDetails* pModuleData = new CModuleDetails;
m_PtrModuleDetailsList.AddTail(pModuleData);
pModuleData = m_listp->GetNext(modulePos1);
int nIndex = m_ImageList.Add(pModuleData->GetAssociatedIcon());
nIndex = nIndex ? nIndex :20;
HTREEITEM hProcessModu = pCtrl.InsertItem(pModuleData->GetFullFileName(),nIndex,nIndex,pNMTreeView->itemNew.hItem);
pCtrl.SetItemData( hProcessModu, reinterpret_cast<DWORD>(pModuleData));
}
}
if(pModuleInfo->IsProcessTrue())
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
else
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
}
if(pModuleInfo)
{
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 0,_T("Module Name"),0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(0, 1, pModuleInfo->GetModuleName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 1,_T("Module Path"),0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(1, 1, pModuleInfo->GetFullFileName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 2,_T("Version"),0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(2, 1, pModuleInfo->GetFileVersion());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 3,_T("File Size"),0, LVIS_SELECTED,0, 0);
CString strFileSize;
strFileSize.Format(_T("%ld"),pModuleInfo->GetFileSize());
m_ListCtrl.SetItemText(3, 1,strFileSize);
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 4,_T("Company"),0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(4, 1, pModuleInfo->GetCompanyName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 5,_T("Product Name"),0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(5, 1, pModuleInfo->GetProductName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 6,_T("Description"),0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(6, 1, pModuleInfo->GetFileDescription());
CString strPID;
strPID.Format(_T("%.6d"), pModuleInfo->pProcessID);
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 7,_T("ProcessID"),0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(7, 1, strPID);
}
pCtrl.SetRedraw(TRUE);
*pResult = 0;
}
BOOL CProcessListDlg::LoadProcesses()
{
pCtrl.DeleteAllItems();
pCtrl.SetRedraw(FALSE);
int m_nInitialImageCount = 1;
const int nNewImageCount = m_ImageList.GetImageCount();
for( int nIndex = nNewImageCount; nIndex > m_nInitialImageCount; --nIndex )
{
VERIFY( m_ImageList.Remove( nIndex - 1 ));
}
HTREEITEM root = pCtrl.InsertItem(_T("Processes List"),0,0,NULL);
CEnumProcessList * m_listp = new CEnumProcessList;
m_PtrEnumProcessList.AddTail(m_listp);
for(POSITION modulePos = m_listp->GetHeadPosition();modulePos!=NULL;)
{
CModuleDetails* pModuleData = new CModuleDetails;
m_PtrModuleDetailsList.AddTail(pModuleData);
pModuleData = m_listp->GetNext(modulePos);
int nIndex = m_ImageList.Add(pModuleData->GetAssociatedIcon());
nIndex = nIndex ? nIndex :20;
HTREEITEM hProcess = pCtrl.InsertItem(pModuleData->GetModuleName(),nIndex,nIndex,root);
pCtrl.SetItemData(hProcess, reinterpret_cast<DWORD>(pModuleData));
}
pCtrl.SetRedraw(TRUE);
pCtrl.Expand(root,TVE_EXPAND);
return TRUE;
}
|
|
|
|
|
Problem is that the list m_listp is created inside the function call, which causes more problems...
Just move m_listp from local function to the header file and do a delete(m_listp) in OnDestroy(); of the dialog (OnDestroy must be added).
Next one is this:
CModuleDetails* pModuleData = new CModuleDetails;
pModuleData = m_listp->GetNext(modulePos);
This is wrong, as CModuleDetails is already created inside the list. Just assign the pModuleData to the pointer returned.
CModuleDetails* pModuleData;
pModuleData = m_listp->GetNext(modulePos);
Regards,
jung-kreidler
|
|
|
|
|
There is an error when we select an item on the subtree (a DLL listed in the .EXE item for example)
I changed 2 files and it seems to work without error:
a) ProcListP.h :
add
HANDLE Get_m_hProcess() { return m_hProcess; };
b) ProcessListDlg.cpp :
<pre>void CProcessListDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult)
{
m_ListCtrl.DeleteAllItems();
pCtrl.SetRedraw(FALSE);
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CModuleDetails *pModuleInfo = reinterpret_cast<CModuleDetails *> (pCtrl.GetItemData( pNMTreeView->itemNew.hItem ));
CString strText;
if(pModuleInfo)
{
CEnumProcessList * m_listp = new CEnumProcessList(pModuleInfo->pProcessID);
if ( m_listp->Get_m_hProcess() != NULL )
{
for(POSITION modulePos1 = m_listp->GetHeadPosition();modulePos1!=NULL;)
{
CModuleDetails* pModuleData = new CModuleDetails;
pModuleData = m_listp->GetNext(modulePos1);
int nIndex = m_ImageList.Add(pModuleData->GetAssociatedIcon());
nIndex = nIndex ? nIndex :20;
HTREEITEM hProcessModu = pCtrl.InsertItem(pModuleData->GetFullFileName(),nIndex,nIndex,pNMTreeView->itemNew.hItem);
pCtrl.SetItemData( hProcessModu, reinterpret_cast<DWORD>(pModuleData));
}
}
if(pModuleInfo->IsProcessTrue())
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
else
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
}
if(pModuleInfo)
{
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 0,"Module Name",0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(0, 1, pModuleInfo->GetModuleName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 1,"Module Path",0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(1, 1, pModuleInfo->GetFullFileName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 2,"Version",0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(2, 1, pModuleInfo->GetFileVersion());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 3,"File Size",0, LVIS_SELECTED,0, 0);
CString strFileSize;
strFileSize.Format("%ld",pModuleInfo->GetFileSize());
m_ListCtrl.SetItemText(3, 1,strFileSize);
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 4,"Company",0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(4, 1, pModuleInfo->GetCompanyName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 5,"Product Name",0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(5, 1, pModuleInfo->GetProductName());
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 6,"Description",0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(6, 1, pModuleInfo->GetFileDescription());
CString strPID;
strPID.Format("%.6d", pModuleInfo->pProcessID);
m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, 7,"ProcessID",0, LVIS_SELECTED,0, 0);
m_ListCtrl.SetItemText(7, 1, strPID);
}
pCtrl.SetRedraw(TRUE);
*pResult = 0;
}
MaxMax14
|
|
|
|
|