BngThea 发表于 2017-7-10 14:17:48

《Windows SDK》009 安全的使用字符串

本帖最后由 BngThea 于 2017-7-15 09:53 编辑

一 核心知识点
* 字符串处理
1 可以使用旧的字符串处理函数lstrlen, wprintf, lstrcat, lstrcpy
2 在Windows编程中推荐使用更安全的函数,这些函数都被包含在strsafe.h中
3 上面两者的区别主要在于后者加强了对字符串长度的限定,从而有效的防止溢出漏洞的产生


二 新API函数
* StringCchLength(szBuffer, 128, &iTarget)
该函数获得字符串的长度,不含结尾的'\0'

1该函数从最大128个字符空间中扫描szBuffer字符串的长度,并将结果赋值给iTarget,其中128可以设置为任意无符号整型

2该函数返回一个HRESULT,可以通过SUCCEEDED于判定是否成功

* StringCchPrintf(szBuffer, 128, TEXT("%3d: %s"), i + 1, TEXT("I love FishC.com!"));
该函数将字符串的内容放到缓存中

1 各参数含义:
第一个参数:缓存,用来存放字符串的对象
第二个参数:限定的字符个数,可以为任意无符号整型,但要保证够用
第三个参数:字符串格式
随后的参数:字符串内容

2 上述语句结果:将行号 + I love FishC.com! 存放到szBuffer中

3 该函数可以响应浮点数类型数据(wsprintf不能)

4 该函数返回一个HRESULT,可以通过SUCCEEDED于判定是否成功

* StringCchCat(szTargetBuffer, 256, szSequentBuffer)
该函数将两个字符串拼接起来

1 各参数含义:
第一个参数:目标缓存,将存放拼接后的字符串
第二个参数:限定的字符个数,可以为任意无符号整型,但要保证够用
第三个参数:被拼接到后面的字符串

2 上述语句结果:将第一个参数和第三个参数的内容拼接起来,并存放到第一个参数中

3 该函数应保证第二个参数足以放下两个字符串的长度+1(结尾'\0')

4 该函数返回一个HRESULT,可以通过SUCCEEDED于判定是否成功

* StringCchCopy(szTargetBuffer, 256, szBuffer)
该函数使用基本同StringCchCat,只是功能改为将第三个参数中的字符串拷贝到第一个参数中


三 示例
    比较常用的用于判定字符串操作的代码如下if (SUCCEEDED(StringCchCat(szTargetBuffer, 256, szSequentBuffer)))
      //do something
else
      //do other thing

小甲鱼 发表于 2017-7-10 18:12:25

不错,整理的挺好~

yixinwenxin 发表于 2021-5-29 14:48:11

+1
页: [1]
查看完整版本: 《Windows SDK》009 安全的使用字符串