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转换为字符串
1. 不应该直接使用L,而是应该用_T
2. 这里只需要temp的只读拷贝,不需要GetBuffer,现在不知道为什么,很多人滥用GetBuffer,完全不知道这个函数是干吗的
合理的尝试应该是
TRACE(_T("Set==>%s\r\n"),(LPCTSTR)temp);
这里需要LPCTSTR转换我记得是因为不定参数需要原始类型,不能是类对象。也就是说,TRACE不可能根据%s知道需要把temp转换为字符串
#5
TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)
#6
试过我的方法没有?
#7
TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)
#8
4楼高手哦
#9
试过了,和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諎搹鶴
试了好多方法,都不得行 我顶楼的帖子就是把所有都试一次 不知道怎么解决这个问题
字符串的值是一样的,你不信可以自己试
CString temp;
temp.Format(_T("测试输出"));
TRACE("%s",(LPCTSTR)temp); //这句(LPCTSTR) 加不加结果都一样 输出为 Km諎搹鶴
试了好多方法,都不得行 我顶楼的帖子就是把所有都试一次 不知道怎么解决这个问题
#11
直接这样输出 TRACE("%s","测试输出"); 就能正确看到输出结果,不是乱码?
难道trace不支持 UNICODE?
难道trace不支持 UNICODE?
#12
网上到处都有人说 %S 大写的s,为什么我的unicode project 编译没错,一执行就会弹出一个提示框,未知的错误? 在output 会有一些信息输出
#13
确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")
其中 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
哎,郁闷啊,多好的功能啊....居然让我给碰上了
谢谢,我也追过他的代码,只是我太菜了哈,不敢随便说那是BUG,只好求教各位大大们
#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转换为字符串
1. 不应该直接使用L,而是应该用_T
2. 这里只需要temp的只读拷贝,不需要GetBuffer,现在不知道为什么,很多人滥用GetBuffer,完全不知道这个函数是干吗的
合理的尝试应该是
TRACE(_T("Set==>%s\r\n"),(LPCTSTR)temp);
这里需要LPCTSTR转换我记得是因为不定参数需要原始类型,不能是类对象。也就是说,TRACE不可能根据%s知道需要把temp转换为字符串
#5
TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)
#6
试过我的方法没有?
#7
TRACE()输出中文的话,确实是有问题的,试了一下,英文没问题。(VS2008, Unicode工程)
#8
4楼高手哦
#9
试过了,和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諎搹鶴
试了好多方法,都不得行 我顶楼的帖子就是把所有都试一次 不知道怎么解决这个问题
字符串的值是一样的,你不信可以自己试
CString temp;
temp.Format(_T("测试输出"));
TRACE("%s",(LPCTSTR)temp); //这句(LPCTSTR) 加不加结果都一样 输出为 Km諎搹鶴
试了好多方法,都不得行 我顶楼的帖子就是把所有都试一次 不知道怎么解决这个问题
#11
直接这样输出 TRACE("%s","测试输出"); 就能正确看到输出结果,不是乱码?
难道trace不支持 UNICODE?
难道trace不支持 UNICODE?
#12
网上到处都有人说 %S 大写的s,为什么我的unicode project 编译没错,一执行就会弹出一个提示框,未知的错误? 在output 会有一些信息输出
#13
确实是VS2008的bug,看看下面代码:
其中 pfnCrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%S", szBuf);
中的"%S"应该是L"%S"或者_T("%S")
其中 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
哎,郁闷啊,多好的功能啊....居然让我给碰上了
谢谢,我也追过他的代码,只是我太菜了哈,不敢随便说那是BUG,只好求教各位大大们
#15
恩,输出宽字符确实是有问题