本帖最后由 efbbc 于 2009-11-13 14:38:43 编辑

解决方案 »

  1.   

    好像 OutputString 不能超过 256,
      

  2.   

    这个程序是Unicode 我改成TCHAR buff[255];
    也一样出错
      

  3.   

    写错了,我是说 OutputDebugString 不能超过 256,你试试,
      

  4.   

    哦,不是 OutputDebugString 的问题,
    你是不是在后台线程调用的 OutputString ??
      

  5.   


    是的。我在这里下的断点dwResult = RasSetEntryProperties(NULL, pszEntryName, &rasEntry, sizeof(rasEntry), NULL, 0);
    if (dwResult != 0)
    {
    OutputString(_T("RasSetEntryProperties %s failed error=%d\n"), pszEntryName, dwResult);
    return FALSE;
    }运行到
    OutputString 里的AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);这一行就出错
      

  6.   

    CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST); 
    改成
    CListCtrl *pListCtrl = (CListCtrl *)(AfxGetMainWnd()->GetDlgItem(IDC_LIST)); 
    试试
      

  7.   

    改成CListCtrl *pListCtrl = (CListCtrl *)(AfxGetMainWnd()->GetDlgItem(IDC_LIST));运行还是同样的错是运行到这一行
    AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff); 
    就出错
      

  8.   

    你在后台线程这么调用肯定出错,因为 AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff); 是 MFC 的东西,界面的 HWND 在主线程里有映射,在后台线程没有映射,
    AfxGetMainWnd() 找到的 CWnd * 是不对的,
    你应该 PostMessage 到主界面,
    在主界面响应PostMessage 的事件,做 GetDlgItem(IDC_STATUS)->SetWindowText 的操作,
    这样才可以,在后台线程调用 SetWindowText 等 SendMessage 的操作是很容易锁住的,(不是每次都锁住,SendMessage 要调用到内核里去塞住,所以有可能,但不频繁)
    这一点,很多人都没有搞清楚,
      

  9.   

    void OutputString( TCHAR *lpFmt, ... ) 

        TCHAR buff[1024]; 
        va_list    arglist; 
        va_start( arglist, lpFmt ); 
        _vsntprintf_s( buff, sizeof buff, lpFmt, arglist ); 
        va_end( arglist );     PCHAR pszText = new CHAR[Length];
        strcpy(pszText, buff);
        PostMessage(主界面的 HWND,XMessage, pszText, Length);
        OutputDebugString(buff); 
    } 主界面, OnXMessage(param1, param2)
    {
    CHAR szText[];
    strcpy(szTExt, param1);
    delete []param1;AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(szText); CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST); int nItem = pListCtrl->GetSelectionMark(); 
    if (nItem != -1) 

    pListCtrl->SetItemText(nItem, 4, szText); 
    return; 
    }
    }
     
    大致是这么这意思,
      

  10.   

    主界面LRESULT CVPNClientDlg::OutStr(WPARAM wParam, LPARAM lParam) 

    TCHAR szText[1024]; lstrcpy(szText, wParam); // delete []wParam;  AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(szText);  CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST);  int nItem = pListCtrl->GetSelectionMark(); 
    if (nItem != -1) 

    pListCtrl->SetItemText(nItem, 4, szText); 
    return 0; 


    别的文件void OutputString( TCHAR *lpFmt, ... )
    {
    TCHAR buff[1024];
    va_list    arglist;
    va_start( arglist, lpFmt );
    _vsntprintf_s( buff, sizeof buff, lpFmt, arglist );
    va_end( arglist ); TCHAR* pszText = new TCHAR[1024]; lstrcpy(pszText, buff); PostMessage(NULL,OutStr, pszText,1024); OutputDebugString(buff);
    }这样吗.可能是我太笨还没有编译成功不知道这里是不 是应该用这个LRESULT CVPNClientDlg::OutStr(WPARAM wParam, LPARAM lParam) 
      

  11.   

    ON_MESAGE()要加到,主界面的事件处理里去,
    WPARAM wParam 要转换为 PCHAR ,记住要 delete [];PostMessage(主界面的 HWND,OutStr, pszText,1024); 这里一定要是你加处理事件的窗口的 HWND
      

  12.   

    试试这样写
    AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
    CListCtrl *pListCtrl = (CListCtrl *)(AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_LIST));