MBCS迁移到Unicode

1、搜索所有的AfxMessagebox和Messagebox函数,将其中的字符串加上_T()宏。
    2、搜索所有的str.Format函数,为第一个参数加上_T()宏。
    3、为字符串常量加上_T()宏。
    4、将strlen、strcpy等函数替换为wcslen、wcscpy等宽字符版本。
    5、如果wcsncpy、wcsncmp等函数的第三个参数是sizeof(dst),那么现在就要改为sizeof(dst)/2,或者自定义一个宏tsizeof来实现。
    6、如果某个函数确实需要char*等类型的参数,使用T2A()宏对参数进行转换,并在所在函数开头添加”USES_CONVERSION;”。
    7、查找所有的char* p = (LPSTR)(LPCTSTR)CString这样的强制转换代码,并用char *p = T2A(CString);代替。

    通常修改完以上内容,再次编译时错误应该减少了大半了,现在再一个一个地对照修改就容易多了。

    最后,配置文件也要存储为Unicode的形式。Unicode的文件头有个0xFEFF标识,如果你是通过::WritePrivateProfileString()来写入配置文件的,那么只需要在调用此API之前往文件里写入0xFEFF文件头,此后WritePrivateProfileString会自动将后续内容保存成Unicode的形式。为了简单,可以讲程序中调用的::WritePrivateProfileString()全都替换成如下改写版本即可:

static BOOL _WritePrivateProfileString(LPCTSTR lpAppName, // section name
                   LPCTSTR lpKeyName, // key name
                   LPCTSTR lpString,   // string to add
                   LPCTSTR lpFileName // initialization file
                   )
{
    FILE *fp;
    fp = _tfopen(lpFileName, _T("r"));
    if (fp == NULL)
    {
        fp=_tfopen(lpFileName, _T("w+b"));
 
        wchar_t m_strUnicode[1];
        m_strUnicode[0] = wchar_t(0XFEFF);
        fputwc(*m_strUnicode,fp);
    }
    fclose(fp);
 
    return ::WritePrivateProfileString(lpAppName, lpKeyName, lpString, lpFileName);
}


你可能感兴趣的:(mfc)