我有一个CString格式,导致SDK文件output.c中的32位Unicode MFC Static / VS2013项目崩溃。第1629行while (i-- && *pwch)
bool MyClass::Function1(LPCTSTR sAppName, HKEY hKey, LPCTSTR tcszValue1, LPCTSTR tcszValue2, LPCTSTR tcszValue3, BOOL bValue)
{
__int64 nAppId=0;
__int64 nId2=0;
sSql.Format(_T("INSERT INTO Table (AppId, Id2, RegPath, RegKey, RegValueName,
bRecurseDelete, RemoveIt) VALUES ('%d', '%d', '%s', '%s', '%s', '%d', 1)"),
nAppId, nId2, tcszValue1, tcszValue2, tcszValue3, bValue);
}
当我在64位编译时它没有任何问题,32位当sValue3为空时崩溃(但不是第一次,当sValue为空时第4次调用CString.Format)
答案 0 :(得分:3)
您必须使用%lld
格式说明符而不是%d
说明符。
在32位世界中,%d
需要32位整数。但是你提供64位整数作为参数。因此,您会得到未定义的行为,因为Format
将完全混淆参数。
答案 1 :(得分:0)
坏了!您不能在Format语句中使用CString对象。始终使用GetString!
CString sValue1 = tcszValue1;
CString sValue2 = tcszValue2;
CString sValue3 = tcszValue3;
sSql.Format(_T("INSERT INTO Table (AppId, Id2, RegPath, RegKey, RegValueName, bRecurseDelete, RemoveIt) VALUES ('%d', '%d', '%s', '%s', '%s', '%d', 1)"),
nAppId, nId2, sValue1.GetString(), sValue2.GetString(), sValue3.GetString(), bValue);