AfxMessageBox - 访问冲突

AfxMessageBox - Access violation

事情是这样的。当我尝试 运行 来自我的 CDialog 扩展 class 的 AfxMessageBox 时,我得到一个错误(见下文)。我已经在互联网上进行了搜索,但没有找到。这是消息框唯一失败的地方,我知道其余代码有效(我逐步完成)。

有人知道如何解决这个问题吗?

提前致谢!

AFXMESSAGEBOX 打开时的错误消息:

IsoPro.exe 中 0x014b4b70 处的未处理异常:0xC0000005:访问冲突读取位置 0x34333345。

从 CDialog 中启动 AfxMessageBox 的代码

LPTSTR temp;
mainPassword.GetWindowText((LPTSTR)temp,100);
CString cstr;
cstr.Format("mainPassword = %s",temp);
AfxMessageBox(cstr);

显示 CDialog 的代码:

CEnterpriseManagementDialog* emd = new CEnterpriseManagementDialog();
emd->Create(IDD_ENTERPRISE_MANAGEMENT_DIALOG);
emd->ShowWindow(SW_SHOW);

看起来变量temp是一个未初始化的指针(the definition of LPTSTR是一个char *)。

尝试将 temp 定义为数组:

TCHAR temp[64];

问题是你如何使用GetWindowText:

LPTSTR temp;
mainPassword.GetWindowText((LPTSTR)temp,100);

您正在让 GetWindowText 尝试通过未初始化的 temp 指针写入一些 未分配的 内存。如果你真的想使用原始输出缓冲区,你应该分配它的空间传递一个指针到GetWindowText之前,例如:

TCHAR temp[100];
mainPassword.GetWindowText(temp, _countof(temp));
// NOTE: No need to LPTSTR-cast

但是,由于您使用的是 C++,您可能只想使用字符串 class,如 CString,而不是原始缓冲区,例如:

CString password;
mainPassword.GetWindowText(password);

CString msg;
msg.Format(_T("mainPassword = %s"), password.GetString());
// or you can just concatenate CStrings using operator+ ... 
AfxMessageBox(msg);