TRACE 显示 CString 字符串问题 定义了 UNICODE

时间:2021-08-21 20:18:10
CString temp;
temp.Format(_T("测试功能"));

TRACE("Set==>%S\r\n",temp);

AtlThrow: hr = 0x80004005
Warning: constructing COleException, scode = E_FAIL ($80004005).
First-chance exception at 0x758b9617 in demo.exe: Microsoft C++ exception: COleException at memory location 0x007cdf2c..
Warning: Uncaught exception in WindowProc (returning 0).

出现上面提示

TRACE("Set==>%s\r\n",temp);
中文显示为乱码

TRACE(L"Set==>%s\r\n",temp);TRACE(_T("Set==>%s\r\n"),temp);
_CrtDbgReport: String too long or IO Error

15 个解决方案

#1


TRACE("Set==>%S\r\n",(LPCTSTR)temp);

#2


UNICODE与_UNICODE最好同时定义。

#3


试试TRACE(L"Set==>%s\r\n",temp.GetBuffer());

#4


两个错误
1. 不应该直接使用L,而是应该用_T
2. 这里只需要temp的只读拷贝,不需要GetBuffer,现在不知道为什么,很多人滥用GetBuffer,完全不知道这个函数是干吗的

合理的尝试应该是
TRACE(_T("Set==>%s\r\n"),(LPCTSTR)temp);

这里需要LPCTSTR转换我记得是因为不定参数需要原始类型,不能是类对象。也就是说,TRACE不可能根据%s知道需要把temp转换为字符串

引用 3 楼 xianzi123 的回复:
试试TRACE(L"Set==>%s\r\n",temp.GetBuffer());

#5


TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)

#6


试过我的方法没有?
引用 5 楼 visualeleven 的回复:
TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)

#7


TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)

#8


4楼高手哦

#9


引用 4 楼 arong1234 的回复:
两个错误
1. 不应该直接使用L,而是应该用_T
2. 这里只需要temp的只读拷贝,不需要GetBuffer,现在不知道为什么,很多人滥用GetBuffer,完全不知道这个函数是干吗的

合理的尝试应该是
TRACE(_T("Set==>%s\r\n"),(LPCTSTR)temp);

这里需要LPCTSTR转换我记得是因为不定参数需要原始类型,不能是类对象。也就是说,TRACE……

试过了,和lz描述的一样,_CrtDbgReport: String too long or IO Error(显示信息)

#10


其实在定义了 _UNICODE 后,你temp.Format(L"");与_T("");他们的结果是一样的

字符串的值是一样的,你不信可以自己试

CString temp;
temp.Format(_T("测试输出"));
TRACE("%s",(LPCTSTR)temp); //这句(LPCTSTR) 加不加结果都一样 输出为  Km諎搹鶴

试了好多方法,都不得行 我顶楼的帖子就是把所有都试一次 不知道怎么解决这个问题

#11


直接这样输出  TRACE("%s","测试输出"); 就能正确看到输出结果,不是乱码?

难道trace不支持 UNICODE?

#12


网上到处都有人说 %S 大写的s,为什么我的unicode project 编译没错,一执行就会弹出一个提示框,未知的错误? 在output 会有一些信息输出

#13


确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")

void __cdecl AtlTraceVU(DWORD_PTR dwModule, const char *pszFileName, int nLine,
DWORD_PTR dwCategory, UINT nLevel, const WCHAR *pszFormat, va_list ptr)
{
const CAtlTraceCategory *pCategory;
CAtlTraceModule::fnCrtDbgReport_t pfnCrtDbgReport = NULL;
const int nCount = 1024;
WCHAR szBuf[nCount] = {L'\0'};
int nLen = 0;

if(ShouldTraceOutput(dwModule, dwCategory, nLevel, &pCategory, &pfnCrtDbgReport))
{
if (nLen >= 0 && nLen < nCount)
                {
                        if(g_Allocator.GetProcess()->m_bFileNameAndLineNo && nLen < nCount && nLen >= 0)
        {
        int nTemp;
        ATL_CRT_ERRORCHECK_SPRINTF(nTemp = _snwprintf_s(szBuf + nLen, nCount - nLen, nCount - nLen - 1, L"%S(%d) : ", pszFileName, nLine));
        if( nTemp < 0 )
        nLen = nCount;
        else
        nLen += nTemp;
        }
                }
if (nLen >= 0 && nLen < nCount)
                {
                        if(pCategory && g_Allocator.GetProcess()->m_bFuncAndCategoryNames)
        {
        int nTemp;
        ATL_CRT_ERRORCHECK_SPRINTF(nTemp = _snwprintf_s(szBuf + nLen, nCount - nLen, nCount - nLen - 1, L"%s: ", pCategory->Name()));
        if( nTemp < 0 )
        nLen = nCount;
        else
        nLen += nTemp;
        }

                }
if (nLen >= 0 && nLen < nCount)
{
ATL_CRT_ERRORCHECK_SPRINTF(_vsnwprintf_s(szBuf + nLen, nCount - nLen, nCount - nLen - 1, pszFormat, ptr));
}

if(pfnCrtDbgReport)
pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
else
OutputDebugStringW(szBuf);
}

}

#14


引用 13 楼 arong1234 的回复:
确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")

C/C++ code

void __cdecl AtlTraceVU(DWORD_PTR dwModule, const char *pszFileName, int nL……


哎,郁闷啊,多好的功能啊....居然让我给碰上了
谢谢,我也追过他的代码,只是我太菜了哈,不敢随便说那是BUG,只好求教各位大大们

#15


引用 14 楼 lfs09 的回复:
引用 13 楼 arong1234 的回复:
确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")

C/C++ code

void __cdecl AtlTraceVU(DWORD_PTR dwModule, const c……

恩,输出宽字符确实是有问题

#1


TRACE("Set==>%S\r\n",(LPCTSTR)temp);

#2


UNICODE与_UNICODE最好同时定义。

#3


试试TRACE(L"Set==>%s\r\n",temp.GetBuffer());

#4


两个错误
1. 不应该直接使用L,而是应该用_T
2. 这里只需要temp的只读拷贝,不需要GetBuffer,现在不知道为什么,很多人滥用GetBuffer,完全不知道这个函数是干吗的

合理的尝试应该是
TRACE(_T("Set==>%s\r\n"),(LPCTSTR)temp);

这里需要LPCTSTR转换我记得是因为不定参数需要原始类型,不能是类对象。也就是说,TRACE不可能根据%s知道需要把temp转换为字符串

引用 3 楼 xianzi123 的回复:
试试TRACE(L"Set==>%s\r\n",temp.GetBuffer());

#5


TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)

#6


试过我的方法没有?
引用 5 楼 visualeleven 的回复:
TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)

#7


TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)

#8


4楼高手哦

#9


引用 4 楼 arong1234 的回复:
两个错误
1. 不应该直接使用L,而是应该用_T
2. 这里只需要temp的只读拷贝,不需要GetBuffer,现在不知道为什么,很多人滥用GetBuffer,完全不知道这个函数是干吗的

合理的尝试应该是
TRACE(_T("Set==>%s\r\n"),(LPCTSTR)temp);

这里需要LPCTSTR转换我记得是因为不定参数需要原始类型,不能是类对象。也就是说,TRACE……

试过了,和lz描述的一样,_CrtDbgReport: String too long or IO Error(显示信息)

#10


其实在定义了 _UNICODE 后,你temp.Format(L"");与_T("");他们的结果是一样的

字符串的值是一样的,你不信可以自己试

CString temp;
temp.Format(_T("测试输出"));
TRACE("%s",(LPCTSTR)temp); //这句(LPCTSTR) 加不加结果都一样 输出为  Km諎搹鶴

试了好多方法,都不得行 我顶楼的帖子就是把所有都试一次 不知道怎么解决这个问题

#11


直接这样输出  TRACE("%s","测试输出"); 就能正确看到输出结果,不是乱码?

难道trace不支持 UNICODE?

#12


网上到处都有人说 %S 大写的s,为什么我的unicode project 编译没错,一执行就会弹出一个提示框,未知的错误? 在output 会有一些信息输出

#13


确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")

void __cdecl AtlTraceVU(DWORD_PTR dwModule, const char *pszFileName, int nLine,
DWORD_PTR dwCategory, UINT nLevel, const WCHAR *pszFormat, va_list ptr)
{
const CAtlTraceCategory *pCategory;
CAtlTraceModule::fnCrtDbgReport_t pfnCrtDbgReport = NULL;
const int nCount = 1024;
WCHAR szBuf[nCount] = {L'\0'};
int nLen = 0;

if(ShouldTraceOutput(dwModule, dwCategory, nLevel, &pCategory, &pfnCrtDbgReport))
{
if (nLen >= 0 && nLen < nCount)
                {
                        if(g_Allocator.GetProcess()->m_bFileNameAndLineNo && nLen < nCount && nLen >= 0)
        {
        int nTemp;
        ATL_CRT_ERRORCHECK_SPRINTF(nTemp = _snwprintf_s(szBuf + nLen, nCount - nLen, nCount - nLen - 1, L"%S(%d) : ", pszFileName, nLine));
        if( nTemp < 0 )
        nLen = nCount;
        else
        nLen += nTemp;
        }
                }
if (nLen >= 0 && nLen < nCount)
                {
                        if(pCategory && g_Allocator.GetProcess()->m_bFuncAndCategoryNames)
        {
        int nTemp;
        ATL_CRT_ERRORCHECK_SPRINTF(nTemp = _snwprintf_s(szBuf + nLen, nCount - nLen, nCount - nLen - 1, L"%s: ", pCategory->Name()));
        if( nTemp < 0 )
        nLen = nCount;
        else
        nLen += nTemp;
        }

                }
if (nLen >= 0 && nLen < nCount)
{
ATL_CRT_ERRORCHECK_SPRINTF(_vsnwprintf_s(szBuf + nLen, nCount - nLen, nCount - nLen - 1, pszFormat, ptr));
}

if(pfnCrtDbgReport)
pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
else
OutputDebugStringW(szBuf);
}

}

#14


引用 13 楼 arong1234 的回复:
确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")

C/C++ code

void __cdecl AtlTraceVU(DWORD_PTR dwModule, const char *pszFileName, int nL……


哎,郁闷啊,多好的功能啊....居然让我给碰上了
谢谢,我也追过他的代码,只是我太菜了哈,不敢随便说那是BUG,只好求教各位大大们

#15


引用 14 楼 lfs09 的回复:
引用 13 楼 arong1234 的回复:
确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")

C/C++ code

void __cdecl AtlTraceVU(DWORD_PTR dwModule, const c……

恩,输出宽字符确实是有问题