大家看看我这代码哪错了,运行不了报错!
头文件中:
LPTVSORTCB pSort; 
CTreeCtrl m_Tree;//控制变量
static int  CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);void CbcDlg::OnBnClickedButton1()
{
pSort->hParent=TVI_ROOT;
pSort->lParam=(LPARAM)&m_Tree; 
pSort->lpfnCompare=MyCompareProc;
m_Tree.SortChildrenCB(pSort);
}
int CALLBACK CbcDlg::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CTreeCtrl* pmyTreeCtrl = (CTreeCtrl*) lParamSort;
CString  strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);
CString  strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);
return strcmp(strItem2, strItem1);
}

解决方案 »

  1.   

    在Unicode环境下,
    CString类型就是宽字符WCHAR,而strcmp要求两个参数是多字节,因此需要使用W2A宏进行转化:
    CbcDlg::MyCompareProc方法修改如下:
    int   CALLBACK   CTreeSortDlg::MyCompareProc(LPARAM   lParam1,   LPARAM   lParam2,   LPARAM   lParamSort) 

    CTreeCtrl*   pmyTreeCtrl   =   (CTreeCtrl*)   lParamSort; 
    CString     strItem1   =   pmyTreeCtrl-> GetItemText((HTREEITEM)   lParam1); 
    CString     strItem2   =   pmyTreeCtrl-> GetItemText((HTREEITEM)   lParam2); 
    LPTSTR lptstr1=strItem1.GetBuffer();//取出CString缓冲区
    LPTSTR lptstr2=strItem2.GetBuffer();
    USES_CONVERSION; //使用ATL自带的转化宏
    const char* pch1=W2A(lptstr1);  //将宽字符转化成多字节
    const char* pch2=W2A(lptstr2);  //
    return   strcmp(pch1,   pch2); 
    }
    对于LPTSTR类型,它在Unicode环境中是LPWSTR类型,在多字节环境中是LPSTR类型。
      

  2.   

    还是出这样的问题!
    yy.exe 中的 0x00443b6c 处最可能的异常: 0xC0000005: 写入位置 0xcccccccc 时发生访问冲突 
    报错中断出现在这函数中!
    void   CbcDlg::OnBnClickedButton1() 

    pSort-> hParent=TVI_ROOT; 
    pSort-> lParam=(LPARAM)&m_Tree;   
    pSort-> lpfnCompare=MyCompareProc; 
    m_Tree.SortChildrenCB(pSort); 

    是哪出了问题,大家救救我啊!
      

  3.   

    请问这SortChildrenCB函数的实现有什么特别注意的地方啊!
    郁闷了哈!
    一直是在那中断!
    不知道哪出了问题了哈!