GetSaveFileNameW返回的结构体路径名缺少后缀

bigtreeYoung 2019-09-05 04:08:18
最近在做一个项目,具体是勾住某个软件的另存为操作,对另存为出来的文件进行别的处理
思路是用钩子勾住了软件另存为时使用的GetSaveFileNameW API
GetSaveFileNameW的原型如下
BOOL GetSaveFileName(LPOPENFILENAME Ipofn)

在我们成功勾住了GetSaveFileName,然后读lpofn里面的内容时,诡异的事情发生了。
lpofn里面的lpstrFile存放的是文件全路径,但是只有到文件名部分,没有后缀。
比如,另存为的文件是F:\Doc\test.doc,但是lpofn->lpstrFile内容只有F:\Doc\test这部分,没有后缀。

按理说GetSaveFileName是写好的API,即使是不同的应用程序,但是在使用这个API之后,返回应该是一样的啊,为啥这个程序会缺斤少两呢。

然后我们又勾住NtCreateFile,生成文件时又变成带后缀的完整路径了,百思不得其解,还望各位大牛不吝赐教
...全文
474 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigtreeYoung 2019-11-11
  • 打赏
  • 举报
回复
引用 4 楼 zwfgdlc 的回复:
好像WIN7之后都不走这个API了吧,还在用XP?

确实,再Vista之后的系统都不用这个API了
就是开发的软件需要兼容旧操作系统,所以要用到。

后来搞明白是啥了。检查GetSaveFileName的OPENFILENAME结构体,发现里面有个以NULL分隔包含多个后缀名的字符串lpstrFilter,并且在nFileExtension = 0以及nFilterIndex != 0的时候,通过将lpstrFilter字符串的地址移动nFilterIndex * 2次的 strlen(lpstrFilter) ,就可以得到本次另存为文件的后缀。
将得到的后缀和lpstrFile拼接之后,就可以得到完整的文件名。
因为这个后缀名lpstrFilter是以null隔开,两个null结尾,所以一开始用APImonitor只能开到第一个后缀,后面的内容都看不到。
zwfgdlc 2019-09-16
  • 打赏
  • 举报
回复
好像WIN7之后都不走这个API了吧,还在用XP?
schlafenhamster 2019-09-12
  • 打赏
  • 举报
回复
系统 不显示 扩展 名 ?
bigtreeYoung 2019-09-12
  • 打赏
  • 举报
回复
引用 1 楼 Eleven 的回复:
那lpstrFileTitle 成员含有这个文件后缀名吗?

这个值是空的
Eleven 2019-09-05
  • 打赏
  • 举报
回复
那lpstrFileTitle 成员含有这个文件后缀名吗?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧