MFC / CLI混合模式'System.AccessViolationException'

时间:2016-07-06 10:16:36

标签: multithreading mfc dialog command-line-interface

我正在运行基于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;
}

1 个答案:

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