如题。在CListCtrl 对象调用 sortitem 时,sortitem的参数中的回调函数就不能正确执行。

解决方案 »

  1.   

    不会吧。
    能不能贴出重现该问题的代码看看。
    Capicom控件跟ListControl冲突的可能性不大。
      

  2.   

    我觉得也不会,你试试不声明using namespace CAPICOM;然后使用
    CAPICOM::的方式。我认为可能还是别的地方有问题。
      

  3.   

    可能是我的调用com的方式不对,请指教一下,我是在oninitdlg里调用的,代码如下
    m_listTest.InsertColumn(0,"颁发给",LVCFMT_LEFT, 110,-1);
    m_listTest.InsertColumn(1,"颁发者",LVCFMT_LEFT, 110,-1);
    m_listTest.InsertColumn(2,"颁发者详细信息",LVCFMT_LEFT, 220,-1);
    m_listTest.InsertColumn(3,"截至日期",LVCFMT_LEFT, 110,-1);
       HRESULT hr = S_OK;
    CListCtrl *pCertList;
    pCertList=(CListCtrl *)GetDlgItem(IDC_TESTLIST);
    pCertList->SetItemState(3, LVIS_SELECTED, LVIS_SELECTED);
        //
        // Initialize COM library.
        //
        CoInitialize(0);
        try
        {
     //
            // Open current user My store.
            //
            _bstr_t   bstrName = _T("root");
    CAPICOM::IStorePtr pIStore(__uuidof(CAPICOM::Store));        if (FAILED(hr = pIStore->Open(CAPICOM::CAPICOM_LOCAL_MACHINE_STORE,
                                          bstrName, 
                                          CAPICOM::CAPICOM_STORE_OPEN_READ_ONLY)))
            {
       //      ATLTRACE(_T("Error [%#x]: pIStore->Open() failed at line %d.\n"), hr, __LINE__);
              
    throw hr;
            }        //
            // Display all certificate in the store.
            //
            IUnknownPtr     pIUnknown;
            IEnumVARIANTPtr pIEnum;
            _variant_t      pDisp;
            ULONG           ulFetched;        //
            // Get _NewEnum of Certificates collection.
            //
            if (FAILED(hr = pIStore->Certificates->get__NewEnum(&pIUnknown)))
            {
             //   ATLTRACE(_T("Error [%#x]: pIStore->Certificates->get__NewEnum() failed at line %d.\n"), hr, __LINE__);
                throw hr;
            }        //
            // Get IEnumVARIANT interface of _NewEnum.
            //
            if (FAILED(hr = pIUnknown->QueryInterface(IID_IEnumVARIANT, (void **) &pIEnum)))
            {
            //   ATLTRACE(_T("Error [%#x]: pIUnknown->QueryInterface() failed at line %d.\n"), hr, __LINE__);
                throw hr;
            }        //
            // Now loop through all items in the collection.
    int i=0;
            while (pIEnum->Next(1, &pDisp, &ulFetched) == S_OK)
            {
                //
                // Display the certificate.
                //
    CAPICOM::ICertificate *pCert;
    pCert=(CAPICOM::ICertificate2Ptr)pDisp.pdispVal;
          pCertList->InsertItem(i,((CAPICOM::ICertificate2Ptr)pDisp.pdispVal)->GetInfo(CAPICOM::CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME),-1);
    pCertList->SetItemText(i,1,((CAPICOM::ICertificate2Ptr)pDisp.pdispVal)->GetInfo(CAPICOM::CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME));
    pCertList->SetItemText(i,2,pCert->IssuerName);
    COleDateTime timenow(pCert->ValidToDate);
    pCertList->SetItemText(i,3,timenow.Format(_T("%Y-%m-%d")));
    i++;
                pDisp.Clear();
            }
        }
    catch (...) 
    { }    CoUninitialize();
      

  4.   

    m_listTest 是dialog的一个成员 ,是CListCtrl 类。下面调用排序函数
    void CViewlisttestDlg::OnColumnclickTestlist(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    m_listTest.SortItems(ListCompare,(LPARAM)&m_listTest);
    *pResult = 0;
    }
    int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
    //通过传递的参数来得到CSortList对象指针,从而得到排序方式
    CListCtrl* pV=(CListCtrl*)lParamSort;

    //通过ItemData来确定数据

    CString pInfo1=pV->GetItemText(lParam1,0);
    CString pInfo2=pV->GetItemText(lParam2,0);
    int iCompRes;
    iCompRes=pInfo1.Compare(pInfo2);
    return iCompRes ;
    };
      

  5.   

    上面的代码已经按robinzo(兔子)老兄的建议改过了,但是还是不行,请各位大哥指点一下
      

  6.   

    CAPICOM::IStorePtr pIStore(__uuidof(CAPICOM::Store));
    这个地方没有把pIStore创建起来,正在查找原因
    找到再说了
      

  7.   

    刚开始我也不行,后来发现没有注册dll
    regsvr32 capicom.dll