1、判断一个文件的数据是否为Unicode,需要先从文件读取数据,然后调用函数IsTextUnicode函数去判断。
2、针对api的参数中长度类型参数如果是以cb开头的,需要通过sizeof *len来计算需要的字节数,如果是cch开头的一般调用_countof来计算字符数。
3、到处ASNI和UNICODE函数接口,可以先实现Unicode类型接口,ASNI接口可以通过Unicode接口和WideCharToMultiByte函数实现。
4、比较用户界面的字符串推荐调用函数CompareString(Ex), 内部数据如注册表、文件名、文件路径或者xml元素/属性等类型的字符串数据采用CompareStringOrdinal函数来比较。
5、始终采用安全的字符串处理函数,比如使用后缀为_s的函数,或者前缀为StringCch的函数,采用/GS和/RTCs编译器标识来自动检测缓冲区溢出。
6、字符串类型一律采用TCHAR类型,推荐使用Unicode的字符和字符串。
7、所有安全(后缀为_s)的函数,首要任务是验证传给它们的参数值。要检查的项目包括指针不为NULL,整数在有效范围内,枚举值是有效的,而且缓冲区足以容纳结果数据,如果这些检查中的任何一项失败,函数都会设置局部于线程的c运行时变量errno,并返回一个errno_t值来指出成功或者失败。然而,如何程序采用调试版本构建,会显示一个Debug Assertion Failed对话框,然后终止应用程序运行,如果是发行版本,则直接自动终止应用程序的运行。
8、如果想取消Debug Assertion Failed对话框,自己可以定义一个调试器函数,类型如下:
void InvalidParameterHandler(PCTSTR expression, PCTSTR function, PCTSTR file, unsigned int line, uintptr_t /* pReserved*/);
其中function、file、line 分别描述了出现错误的函数名称、源码文件和源码行号;
下一步调用_set_invalid_parameter_handler来注册这个函数,另外需要在应用程序开头地方调用_CrtSetReportMode(_CRT_ASSERT, 0);从而禁止可能由C运行时触发的所有Debug Assertion Failed对话框。