【发布时间】:2014-12-20 17:56:22
【问题描述】:
我想知道我是否在这里重新发明轮子。
本质上,新的 Common Item Dialog 文件浏览器比旧的 GetOpenFileName() 版本要好得多。如果用户使用的是 Vista+ 操作系统,我想使用新对话框,但在 XP 等上仍有旧对话框的功能。
所以我想知道我是否应该创建一个这样的函数。
BOOL ShowOpenFileDialog(_Out_ LPTSTR szBuffer, _In_ UINT iBufferSize)
{
static DWORD dwMajorVersion = 0;
if (!dwMajorVersion)
dwMajorVersion = (DWORD)(LOBYTE(LOWORD(GetVersion())));
if (dwMajorVersion >= 6) // Vista+
return ShowNewOpenFileDialog(szBuffer, iBufferSize); // show common item
return ShowOldOpenFileDialog(szBuffer, iBufferSize); // fall back to old dialog
}
还有一个后续只有C++的通用项吗?
【问题讨论】:
-
对于新代码,我不确定是否会担心与 XP 或更早版本的兼容性。
-
我同意。唯一的问题是我将在客户端机器上使用这个工具,其中许多仍然有遗留系统。我可以在哪里使用新对话框,这将使我的生活整体幸福感大大提高。
-
不要基于版本号。基于
CoCreateInstance(CLSID_FileOpenDialog)是否成功。版本检查很难做到正确。 -
特别是考虑到
GetVersion/Ex()现在是deprecated in Windows 8.1 以后,因此没有适当的显化。 Raymond 是对的,您应该检查CLSID_IFileOpenDialog是否可用,如果可用,请使用它,在需要时回退到GetOpenFileName()。 -
调用 GetOpenFileName 并让系统将其映射到新的常用项对话框可能是最简单的方法。