zoukankan      html  css  js  c++  java
  • Unicode下TRACE中文(_CrtDbgReport: String too long or IO Error) .解决办法

    Unicode下TRACE中文(_CrtDbgReport: String too long or IO Error)       

    在使用Unicode的工程项目中,如果是Debug模式。
    当TRACE Unicode字符串时,会输出提示:_CrtDbgReport: String too long or IO Error

    有两种方法来解决这个问题


    方法一:直接使用 OutputDebugString 替换 TRACE

    相关说明:
    函数原型:void OutputDebugString(LPCTSTR lpOutputString);
    功能说明:该函数输出一个字符串给调试器用于显示
    例子:
    原语句:TRACE(_T("\n这是一个TRACE语句"));
    替换为:OutputDebugString (_T("\n这是一个TRACE语句"));
    其他相关函数:
    1. CheckRemoteDebuggerPresent:用于判断指定进程是否在调试状态
    2. ContinueDebugEvent:使调试器继续运行之前报告了debugging event的线程
    3. DebugActiveProcess:使调试器附加到一个活动进程上并进行调试
    4. DebugActiveProcessStop:停止正在调试指定进程的调试器
    5. DebugBreak:在当前进程中触发一个断点
    6. DebugBreakProcess:在指定的进程中触发一个断点
    7. DebugSetProcessKillOnExit:空白
    8. FatalExit:空白
    8. FlushInstructionCache:空白
    10. GetThreadContext:空白
    11. GetThreadSelectorEntry:空白
    12. IsDebuggerPresent:空白
    13. OutputDebugString:
    14. ReadProcessMemory:空白
    15. SetThreadContext:空白
    16. WaitForDebugEvent:空白
    17. WriteProcessMemory:空白


    方法二:调用setlocale将语言环境设置成中文
    相关说明:
    函数原型:char *setlocale(int category,const char *locale );
    功能说明:给指定的类别设置语言环境
    注意:需要将原先的语言环境保存,待使用完后将其恢复。
    例子:
    #include <locale.h>
    char* old_locale = _strdup( setlocale(LC_ALL,NULL) );   

    setlocale( LC_ALL, "chs" );              

    //正常使用TRACE,退出时调用下面函数    

    setlocale( LC_ALL, old_locale);
    free(old_locale);
    其他相关函数:
    1. char *_strdup(const char *strSource );
       调用malloc分配内存,并将源字符串复制一份,需要用free释放。

    //======================================================================
    优缺点比较:
    方法一:优点:不需要增加任何函数调用,可以直接使用OutputDebugString输出字符串
                    缺点:不能格式化输出。需要预先将字符串格式化
    方法二:优点:可以直接使用TRACE,不加任何改变
                    缺点:需要进行例子中的操作。

    疑问:

    1. 调用char* plocale = setlocale(LC_ALL,NULL);    返回值是"C."对吗?

  • 相关阅读:
    thinkphp怎么修改配置进入默认首页
    apache中怎么配置网站的默认首页
    [转]数据库更新(Update语句)查询
    ACCESS删除datagridview和数据库中的一条数据,同时更新显示的方法源码
    想ACCESS数据库插入新的用户
    C# 对象不能从 DBNull 转换为其他类型。
    windows form参数传递过程
    向ACCESS数据库中的表导入EXCEL表,在 System.Data.OleDb.OleDbException 中第一次偶然出现的“System.Data.dll”类型的异常
    C#实现Access导入导出Excel
    dataGridView1.DataSource,解决查询结果不从第一行显示,而是不断往表下面扩展问题
  • 原文地址:https://www.cnblogs.com/lidabo/p/2839433.html
Copyright © 2011-2022 走看看