鱼C论坛

 找回密码
 立即注册
查看: 5467|回复: 2

[学习笔记] 《Windows SDK》009 安全的使用字符串

[复制链接]
发表于 2017-7-10 14:17:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
小甲鱼 + 3 + 3 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-10 18:12:25 | 显示全部楼层
不错,整理的挺好~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-29 14:48:11 | 显示全部楼层
+1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 22:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表