我正在运行基于MFC Dialog的应用程序。我有一个串行通信线程在引用类(代码片段之外)中运行,它将一个String ^发送到对话框(所以我可以将通信放在一个窗口中)。问题是(正如您从注释代码中看到的)每次我尝试对该字符串执行任何操作(除了将其分配给局部变量)我得到“DLP_Printer_Control.exe中出现未处理的类型'System.AccessViolationException'异常< / p>
附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。“
在这个片段中,崩溃的是atoi。我正在使用atoi,因为我有想法尝试将每个字符串元素复制到ASCII,然后按值复制到成员CString。那没用。每个注释行都会产生异常。我起诉它试图访问源自托管内存的东西。有建议的解决方法吗?
bool CDLP_Printer_ControlDlg::UpdateCommsWindow_right(String^ strCommsLine)
{
CString strTemp = strCommsLine;
LPWSTR charTemp;
int i = 0;
int i_len = strTemp.GetLength();
if (i_len == 0)
return false;
charTemp= strTemp.GetBuffer(i_len);
i =atoi((const char*)charTemp[0]);
strTemp.ReleaseBuffer();
//if (m_strCommsLeft.IsEmpty())
// return false;
//LPCTSTR szTemp = (LPCTSTR)strTemp;
//m_rightCommsLabel.SetWindowTextW((LPCTSTR)strTemp);
//m_rightCommsLabel.SetWindowTextW(szTemp);
//m_rightCommsLabel.SetWindowTextW(L"SUCCESS");
return true;
}
答案 0 :(得分:1)
在这个片段中,崩溃的是atoi。
i =atoi((const char*)charTemp[0]);
简短回答是charTemp[0]
是一个TCHAR
而 不是 一个指针,所以虽然const char *
强制转换允许它编译,传递给atoi
的值是 而不是 指向有效内存的指针,这会导致System.AccessViolationException
异常。快速解决方法是用i = _wtoi(charTemp);
或i = _ttoi(strTemp);
替换该行,如下所述。
LPWSTR charTemp; /*...*/ charTemp= strTemp.GetBuffer(i_len);
只有在为 Unicode 构建项目时才会编译。这是当今Windows中的常见情况,但值得注意的是,因为您稍后会混合使用非atoi
之类的非Unicode函数。对于可以为宽字符和窄字符集正确编译的变体,可以使用charset-neutral LPTSTR charTemp;
替换声明。
i =atoi((const char*)charTemp[0]);
只有当项目为 Unicode 构建 项目时才会编译,因为atoi
需要一个普通的旧const char *
作为参数。 charset-neutral MS映射为_ttoi,因此在删除错误的[0]
和const char *
强制转换后,代码将变为i = _ttoi(charTemp);
。
最后,CString
有一个内置的LPCTSTR
运算符,因此无需GetBuffer/ReleaseBuffer
并使用中间LPTSTR charTemp;
。以下将一步完成相同的工作。
i = _ttoi(strTemp);