求解 MFC 中断

efbbc 2009-11-13 02:33:07
void OutputString( TCHAR *lpFmt, ... )
{
TCHAR buff[1024];
va_list arglist;
va_start( arglist, lpFmt );
_vsntprintf_s( buff, sizeof buff, lpFmt, arglist );
va_end( arglist );
AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST);

int nItem = pListCtrl->GetSelectionMark();
if (nItem != -1)
{
pListCtrl->SetItemText(nItem, 4, buff);
return;
}
OutputDebugString(buff);
}

运行到这里就中断了。

AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST);


中断代码

中的 0x78aaadcc (mfc90ud.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000020 时发生访问冲突




中断代码行
C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\winocc.cpp

CWnd* CWnd::GetDlgItem(int nID) const
{
ASSERT(::IsWindow(m_hWnd));//中断到这行

if (m_pCtrlCont == NULL)
return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
else
return m_pCtrlCont->GetDlgItem(nID);
}


调用 行

OutputString(_T("RasSetEntryProperties %s failed error=%d\n"), pszEntryName, dwResult);
...全文
298 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
efbbc 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dnybz 的回复:]
试试这样写

C/C++ code
AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
CListCtrl*pListCtrl= (CListCtrl*)(AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_LIST));
[/Quote]

Very Good

可以用了。
wangqiangcc 2009-11-13
  • 打赏
  • 举报
回复
试试这样写


AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
CListCtrl *pListCtrl = (CListCtrl *)(AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_LIST));
efbbc 2009-11-13
  • 打赏
  • 举报
回复
谢谢.
LiuYinChina 2009-11-13
  • 打赏
  • 举报
回复
ON_MESAGE()要加到,主界面的事件处理里去,
WPARAM wParam 要转换为 PCHAR ,记住要 delete [];

PostMessage(主界面的 HWND,OutStr, pszText,1024); 这里一定要是你加处理事件的窗口的 HWND
efbbc 2009-11-13
  • 打赏
  • 举报
回复
主界面

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)
LiuYinChina 2009-11-13
  • 打赏
  • 举报
回复
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;
}
}

大致是这么这意思,
efbbc 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 robertbaker 的回复:]
你在后台线程这么调用肯定出错,因为 AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff); 是 MFC 的东西,界面的 HWND 在主线程里有映射,在后台线程没有映射,
AfxGetMainWnd() 找到的 CWnd * 是不对的,
你应该 PostMessage 到主界面,
在主界面响应PostMessage 的事件,做 GetDlgItem(IDC_STATUS)->SetWindowText 的操作,
这样才可以,

在后台线程调用 SetWindowText 等 SendMessage 的操作是很容易锁住的,(不是每次都锁住,SendMessage 要调用到内核里去塞住,所以有可能,但不频繁)
这一点,很多人都没有搞清楚,

[/Quote]


开始我也想到这个点,就是不知道从何下手。

可以提示一下代码.谢谢..
LiuYinChina 2009-11-13
  • 打赏
  • 举报
回复
你在后台线程这么调用肯定出错,因为 AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff); 是 MFC 的东西,界面的 HWND 在主线程里有映射,在后台线程没有映射,
AfxGetMainWnd() 找到的 CWnd * 是不对的,
你应该 PostMessage 到主界面,
在主界面响应PostMessage 的事件,做 GetDlgItem(IDC_STATUS)->SetWindowText 的操作,
这样才可以,

在后台线程调用 SetWindowText 等 SendMessage 的操作是很容易锁住的,(不是每次都锁住,SendMessage 要调用到内核里去塞住,所以有可能,但不频繁)
这一点,很多人都没有搞清楚,
efbbc 2009-11-13
  • 打赏
  • 举报
回复
改成

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

运行还是同样的错

是运行到这一行
AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
就出错
bragi523 2009-11-13
  • 打赏
  • 举报
回复
CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST);
改成
CListCtrl *pListCtrl = (CListCtrl *)(AfxGetMainWnd()->GetDlgItem(IDC_LIST));
试试
efbbc 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 robertbaker 的回复:]
哦,不是 OutputDebugString 的问题,
你是不是在后台线程调用的 OutputString ??

[/Quote]

是的。

我在这里下的断点

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);

这一行就出错
LiuYinChina 2009-11-13
  • 打赏
  • 举报
回复
哦,不是 OutputDebugString 的问题,
你是不是在后台线程调用的 OutputString ??
LiuYinChina 2009-11-13
  • 打赏
  • 举报
回复
写错了,我是说 OutputDebugString 不能超过 256,你试试,
efbbc 2009-11-13
  • 打赏
  • 举报
回复
这个程序是Unicode 我改成

TCHAR buff[255];
也一样出错
LiuYinChina 2009-11-13
  • 打赏
  • 举报
回复
好像 OutputString 不能超过 256,
efbbc 2009-11-13
  • 打赏
  • 举报
回复
控件ID 是对的。

VC 6 下面可以用。

到了VC9 就出错了。
  • 打赏
  • 举报
回复
控件ID不对。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧