windows - GetSaveFileName() 不返回 XP 上 CD 刻录暂存区的路径

标签 windows visual-c++ winapi windows-xp

我有一个功能,可以将文件保存到用户指定的位置。我正在使用 GetSaveFileName() 来显示另存为对话框。然后我使用它返回的路径将文件写出到该位置。我注意到当用户在 XP 机器上选择 CD-RW 驱动器时它不起作用。同样的过程在 Vista 和 Windows 7 上也能正常工作。我做了以下观察:

  1. GetSaveFileName() 返回的路径返回在 Win7/Vista 上选择 CD 刻录机根文件夹(在我的例子中是 F:)时临时暂存区的路径。
  2. 在 XP 上,选择 CD 刻录机根文件夹只会返回 F:\作为路径。但是,如果我使用“另存为”对话框创建子文件夹并将文件保存在此文件夹中(例如 F:\folder),则路径为临时文件夹的路径。
  3. 在 XP 中使用其他应用程序(如记事本)将正确重定向到 F:\的临时文件夹。

所以只有在XP上保存到CD刻录机的根文件夹时才会出现这个问题。我怎样才能在 XP 中实现与记事本相同的功能,并将“另存为”重定向到临时文件夹,这样我就有了一个可以写入 CreateFile() 的路径?

最佳答案

我认为您返回某些路径的 CD 暂存区这一事实是 IShellFolder::GetDisplayNameOf 函数工作方式的“副产品”。我发现对于 CD 刻录机, 存在于暂存区的文件或文件夹的 PIDL 将转换为引用暂存区的字符串。 CD 上存在的文件或文件夹的 PIDL(无论它是否也存在于暂存区中)将转换为引用 CD 的字符串。因为根文件夹(根据定义)存在于 CD 上,所以它是您作为字符串返回的 CD 路径。

我建议您自己处理。您可以使用 ICDBurn::GetRecorderDriveLetter 函数获取刻录机的驱动器盘符 - 然后与您从 GetSaveFileName() 返回的字符串进行比较就很简单了。如果您确实在 CD 刻录机上取回了路径,您可以使用 SHGetFolderLocationCSIDL_CDBURN_AREA 来获取暂存区的路径 - 然后只需更换驱动器即可路径字符串开头的字母带有暂存区的路径。

关于windows - GetSaveFileName() 不返回 XP 上 CD 刻录暂存区的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118667/

相关文章:

C++ 可以在结构内声明原子变量以保护这些成员吗?

c++ - 检测窗口是否已完成绘制并显示在屏幕上 (WINAPI)

c# - 获取 OEM 和 Ansi 中每个语言环境的代码页

windows - 仅连接到 localhost 时 Winsock 返回 10061

C4700 : uninitialized local variable when combining path

c++ - MFC VC++:CMFCButton::SetFaceColor 不更改背景(脸部)颜色

c++ - 如何使用 Windows x64 记录堆栈帧

c++ - 更改 Code::Blocks 中的主要方法?

c - gcc编译器错误: "cannot find -lcs50 collect2: Id returned 1 exit status"

visual-c++ - Visual C++ 调试错误 - wuser32.pdb 未加载