【问题标题】:GetSaveFileName() not returning path of CD burning staging area on XPGetSaveFileName() 不返回 XP 上 CD 刻录暂存区的路径
【发布时间】:2011-03-08 07:33:30
【问题描述】:

我有一个功能,可以将文件保存到用户指定的位置。我正在使用 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() 写入的路径?

【问题讨论】:

  • 您能否发布一个代码示例,您如何使用GetSaveFileName,尤其是您在OPENFILENAME 中使用的标志。您是否使用例如OFN_NOTESTFILECREATE 标志?
  • 这大概是我正在使用的:OPENFILENAME openFileName; ZeroMemory(&openFileName, sizeof(OPENFILENAME)); openFileName.lStructSize = sizeof(OPENFILENAME); openFileName.Flags = OFN_OVERWRITEPROMPT; openFileName.lpstrFilter = "压缩文件 (*.zip)"; GetSaveFileName(&openFileName);

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这似乎成功了!在 XP 系统上运行时,似乎我必须自己替换 GetRecorderDriveLetter() 的路径。此功能似乎内置于 GetSaveFileName() 的 Vista/Windows7 实现中。
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2014-06-16
  • 2021-05-16
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多