装运箱.32位格式崩溃

CString.Format crashes in 32-bit

本文关键字:格式 崩溃 32位      更新时间:2023-10-16

我有一个CString格式,导致32位Unicode MFC Static/VS2013项目在SDK文件output.c行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为空时(但不是第一次,在第4次调用CString时)它崩溃了。sValue为空时的格式)

必须使用%lld格式说明符,而不能使用%d格式说明符。

在32位世界中,%d期望32位整数。但是您提供64位整数作为参数。因此,您会得到未定义的行为,因为Format将完全混淆参数。

不好!不允许在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);