PathAppend几个注意点

本文介绍了Windows轻量级功能接口PathAppend的使用注意事项,包括头文件包含、参数限制、越界风险及异常处理等,并对比了PathCchAppend等更安全接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

msdn对pathappend介绍的开头就有一句话说误用该接口会导致缓冲越界,建议使用更安全的PathCchAppend 或者PathCchAppendEx接口。今天就说说几个注意点:
(1)头文件包含,一般windows编程包含windows.h就可以,但是用PathAppend就必须要添加shlwapi.h,shlwapi是啥意思,打开.h文件,第一行就是Interface for the Windows light-weight utility APIs 。windows 轻量级功能接口。网上还有一个说明Shell Light-Weight Application Programming Interface,貌似更准确。大概意思也就有数。
(2)接口的两个参数Inout LPTSTR pszPath, In LPCTSTR pszMore
对长度的限制都是MAX_PATH,那附加之后,就会超过这个范围。先说单个参数。输入参数本身如果用strcpy/_tcscpy进行,那本身就已经存在越界的风险。如果这两个子串都在栈空间上,被覆盖是很容易的事。
(3)当我用debug版本测试PathAppend时,发现如果path+more超过MAX_PATH,path就会变成空串。此时PathAppend的返回值是FALSE,所以说,有返回值的接口判断返回值是避免异常最有效的手段。但是需要注意的是此时如果通过GetLastError()获取原因时,返回值是0,同时errno也是0,当然MSDN没说可以用GLE获取,但是这也是一个值得注意的地方。如何获取失败原因?不知道。所以一定要考虑到路径拼接之后的长度,包括可能会自动添加的\加上结尾的null,一共会不会超过MAX_PATH的长度,这个很关键。
(4)第(3)点中说到超过长度,还有一个后果是pszPath会直接变成空串,当然不是把path全部置0,而是第一个字节置0。其实这也是很可能会导致严重问题的设计,还是那句话,要判断返回值 ,不判断那是你的问题,接口不告诉你那是接口的问题。
(5)后来发现(3)(4)说的有问题,如果more参数是空串,那么path是不会置为空串的,而是把path截断为MAX_PATH-1的长度。同事more是空串在路径拼接的时候,也不会自动加斜杠。如果你无法指望用char path[MAX_PATH] = "c:\\test"; PathAppend(path, "");来把c:\test变成c:\test\。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值