求解 MFC 中断 本帖最后由 efbbc 于 2009-11-13 14:38:43 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 好像 OutputString 不能超过 256, 这个程序是Unicode 我改成TCHAR buff[255];也一样出错 写错了,我是说 OutputDebugString 不能超过 256,你试试, 哦,不是 OutputDebugString 的问题,你是不是在后台线程调用的 OutputString ?? 是的。我在这里下的断点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);这一行就出错 CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST); 改成CListCtrl *pListCtrl = (CListCtrl *)(AfxGetMainWnd()->GetDlgItem(IDC_LIST)); 试试 改成CListCtrl *pListCtrl = (CListCtrl *)(AfxGetMainWnd()->GetDlgItem(IDC_LIST));运行还是同样的错是运行到这一行AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff); 就出错 你在后台线程这么调用肯定出错,因为 AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff); 是 MFC 的东西,界面的 HWND 在主线程里有映射,在后台线程没有映射,AfxGetMainWnd() 找到的 CWnd * 是不对的,你应该 PostMessage 到主界面,在主界面响应PostMessage 的事件,做 GetDlgItem(IDC_STATUS)->SetWindowText 的操作,这样才可以,在后台线程调用 SetWindowText 等 SendMessage 的操作是很容易锁住的,(不是每次都锁住,SendMessage 要调用到内核里去塞住,所以有可能,但不频繁)这一点,很多人都没有搞清楚, 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; }} 大致是这么这意思, 主界面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) ON_MESAGE()要加到,主界面的事件处理里去,WPARAM wParam 要转换为 PCHAR ,记住要 delete [];PostMessage(主界面的 HWND,OutStr, pszText,1024); 这里一定要是你加处理事件的窗口的 HWND 试试这样写 AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff); CListCtrl *pListCtrl = (CListCtrl *)(AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_LIST)); 请问一下那个高手可以告诉我一下,应该怎么做才可以让程序支持中文路径,中文菜单阿? 在一个dll内部,如果获得自身所在路径 简单的问题, send()一次最多能传多少数据? 找了很久的工作,后天就要去面试了(VC程序员)。一般是什么问题啊!帮帮我!给分 关于ADO编程的一个简单问题,在线等待,谢谢兄弟!! 简单问题,100分相送! 请看赵薇这个贱货: 如何在对话框中打印表格控件中的内容?(急) 给个用CreateProcess得例子,我不想再查了,谢了,先 VC中如何把SOCKET中接收的字符数组显示在列表视图中 VC + oracle 10G 部署问题请教
也一样出错
你是不是在后台线程调用的 OutputString ??
是的。我在这里下的断点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);这一行就出错
改成
CListCtrl *pListCtrl = (CListCtrl *)(AfxGetMainWnd()->GetDlgItem(IDC_LIST));
试试
AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
就出错
AfxGetMainWnd() 找到的 CWnd * 是不对的,
你应该 PostMessage 到主界面,
在主界面响应PostMessage 的事件,做 GetDlgItem(IDC_STATUS)->SetWindowText 的操作,
这样才可以,在后台线程调用 SetWindowText 等 SendMessage 的操作是很容易锁住的,(不是每次都锁住,SendMessage 要调用到内核里去塞住,所以有可能,但不频繁)
这一点,很多人都没有搞清楚,
{
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;
}
}
大致是这么这意思,
{
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)
WPARAM wParam 要转换为 PCHAR ,记住要 delete [];PostMessage(主界面的 HWND,OutStr, pszText,1024); 这里一定要是你加处理事件的窗口的 HWND
AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
CListCtrl *pListCtrl = (CListCtrl *)(AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_LIST));