On 4/6/21 12:45 PM, Haoyang Chen wrote:
+static BOOL bSortAscending = TRUE; +static UINT ColumnDataHintIndex = 0; +static INT ProcessPageCompareFunc(const VOID* first, const VOID* second) You could probably use qsort_s() to pack that, also please fix prototype.
+ switch (ColumnDataHintIndex) + { + case COLUMN_IMAGENAME: + return lstrcmpW(pPerfData1->ImageName, pPerfData2->ImageName); + case COLUMN_PID: + return pPerfData1->ProcessId > pPerfData2->ProcessId; + case COLUMN_USERNAME: + return lstrcmpW(pPerfData1->UserName, pPerfData2->UserName); + case COLUMN_SESSIONID: + return pPerfData1->SessionId > pPerfData2->SessionId; + case COLUMN_CPUUSAGE: + return pPerfData1->CPUUsage > pPerfData2->CPUUsage; + case COLUMN_CPUTIME: + return pPerfData1->CPUTime.QuadPart > pPerfData2->CPUTime.QuadPart; + case COLUMN_MEMORYUSAGE: + return pPerfData1->vmCounters.WorkingSetSize > pPerfData2->vmCounters.WorkingSetSize; + case COLUMN_PEAKMEMORYUSAGE: + return pPerfData1->vmCounters.PeakWorkingSetSize > pPerfData2->vmCounters.PeakWorkingSetSize; + case COLUMN_MEMORYUSAGEDELTA: + return pPerfData1->WorkingSetSizeDelta > pPerfData2->WorkingSetSizeDelta; + case COLUMN_PAGEFAULTS: + return pPerfData1->vmCounters.PageFaultCount > pPerfData2->vmCounters.PageFaultCount; + case COLUMN_PAGEFAULTSDELTA: + return pPerfData1->PageFaultCountDelta > pPerfData2->PageFaultCountDelta; + case COLUMN_VIRTUALMEMORYSIZE: + return pPerfData1->vmCounters.VirtualSize > pPerfData2->vmCounters.VirtualSize; + case COLUMN_PAGEDPOOL: + return pPerfData1->vmCounters.QuotaPagedPoolUsage > pPerfData2->vmCounters.QuotaPagedPoolUsage; + case COLUMN_NONPAGEDPOOL: + return pPerfData1->vmCounters.QuotaNonPagedPoolUsage > pPerfData2->vmCounters.QuotaNonPagedPoolUsage; + case COLUMN_BASEPRIORITY: + return pPerfData1->BasePriority > pPerfData2->BasePriority; + case COLUMN_HANDLECOUNT: + return pPerfData1->HandleCount > pPerfData2->HandleCount; + case COLUMN_THREADCOUNT: + return pPerfData1->ThreadCount > pPerfData2->ThreadCount; + case COLUMN_USEROBJECTS: + return pPerfData1->USERObjectCount > pPerfData2->USERObjectCount; + case COLUMN_GDIOBJECTS: + return pPerfData1->GDIObjectCount > pPerfData2->GDIObjectCount; + case COLUMN_IOREADS: + return pPerfData1->IOCounters.ReadOperationCount > pPerfData2->IOCounters.ReadOperationCount; + case COLUMN_IOWRITES: + return pPerfData1->IOCounters.WriteOperationCount > pPerfData2->IOCounters.WriteOperationCount; + case COLUMN_IOREADBYTES: + return pPerfData1->IOCounters.ReadTransferCount > pPerfData2->IOCounters.ReadTransferCount; + case COLUMN_IOWRITEBYTES: + return pPerfData1->IOCounters.WriteTransferCount > pPerfData2->IOCounters.WriteTransferCount; + case COLUMN_IOOTHERBYTES: + return pPerfData1->IOCounters.OtherTransferCount > pPerfData2->IOCounters.OtherTransferCount; + } Have you tested this? I looks like it will only work correctly for string fields.
static void ProcessPageOnNotify(LPARAM lParam) { - LPNMHDR pnmh; + LPNMHEADERW pnmh; This is incorrect.
- else if (pnmh->hwndFrom == hProcessPageHeaderCtrl) + else if (pnmh->hdr.hwndFrom == hProcessPageHeaderCtrl) { - switch (pnmh->code) + switch (pnmh->hdr.code) { case HDN_ITEMCLICKW:
- /* - * FIXME: Fix the column sorting - * - *ListView_SortItems(hApplicationPageListCtrl, ApplicationPageCompareFunc, NULL); - *bSortAscending = !bSortAscending; - */ + PerDataSort(ColumnDataHints[pnmh->iItem]); + InvalidateRect(hProcessPageListCtrl, NULL, TRUE);
break; Again, why do you sort only on user clicks? How should it work?