CListCtrl ソートする方法

// sortparam.h ----------------------------------------------------------------
class CSortParameter
{
public:
	CSortParameter() {
		m_bSort = TRUE;
	}
	virtual ~CSortParameter();

	BOOL m_bSort;	//!< 昇順降順のフラグ
	int m_nIndex;	//!< ソートするIndexの番号
};

// dlllistdlg.h
CDllListDlg に以下を追加
	static int CALLBACK CompareData(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); 
	CSortParameter m_sortParam;	//! ソートの方法を指定する

// dlllistdlg.cpp--------------------------------------------------------------

	//CDllListDlg::OnInitDialog()にて---------------------------------------------------------------------------- 

	for (int i=0; i<pApp->m_pluginsInfo.size(); i++) {
		m_dllList.InsertItem(LVIF_TEXT | LVIF_PARAM, i, pApp->m_pluginsInfo.at(i).filename,
			0, 0, 0, (LPARAM)&(pApp->m_pluginsInfo[i]));
		m_dllList.SetItem(i, 1, LVIF_TEXT, pApp->m_pluginsInfo[i].supportedTypes, 0, 0, 0, 0);
		m_dllList.SetItem(i, 2, LVIF_TEXT, pApp->m_pluginsInfo[i].filetime, 0, 0, 0, 0);
	}


/**************************************************************************//**
    @par        説明
				2つの値を比較する。
	@param lParam1	入力値1
	@param lParam2	入力値2
	@param lParamSort 関数内部で任意に使えるvoidポインタ
*1113878543*//***************************************************************************/
int CDllListDlg::CompareData(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	int result = 0;

	PluginInfo* d1 = (PluginInfo*)lParam1;
	PluginInfo* d2 = (PluginInfo*)lParam2;

	CSortParameter* sortParam = (CSortParameter*)lParamSort;

	if (sortParam->m_nIndex == 0) {
		result = strcmp(d1->filename, d2->filename);
	}
	else if (sortParam->m_nIndex == 1) {
		result = strcmp(d1->supportedTypes, d2->supportedTypes);
	}
	else if (sortParam->m_nIndex == 2) {
		result = strcmp(d1->filetime, d2->filetime);
	}

	if (sortParam->m_bSort) {
		result *= -1;
	}

	return result;
}

/**************************************************************************//**
    @brief      リストのヘッダをクリックしたとき呼ばれる。
    @par        説明
				リストのヘッダをクリックしたとき呼ばれる。
				リストのアイテムをソートする。
	@param pNMHDR クリックされたヘッダの情報
	@param pResult よくわからない
*1113878544*//***************************************************************************/
void CDllListDlg::OnColumnclickList3(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

	// 何列目がクリックされたか取得
	m_sortParam.m_nIndex = pNMListView->iSubItem;

	// ソートを行う
	m_dllList.SortItems(CompareData, (DWORD)&m_sortParam);

	// 次回は昇順・降順を逆にする
	m_sortParam.m_bSort = !m_sortParam.m_bSort;

	*pResult = 0;
}