是否显示Common Item Dialog或GetOpenFileName?(Win32 API)

Har*_*rry 3 c c++ winapi dialog file

我想知道我是否在这里重新发明轮子.

实质上,新的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
}
Run Code Online (Sandbox Code Playgroud)

另外一个跟进是C++的常用项目吗?

Rem*_*eau 6

正如Raymond Chen所说,你不应该依赖版本号,而是依赖于功能的可用性,例如:

BOOL ShowOpenFileDialog(_Out_ LPTSTR szBuffer, _In_ UINT iBufferSize)
{
    IFileDialog *pfd = NULL;
    HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_IFileDialog, (void**)&pfd);
    if (SUCCEEDED(hr))
    {
        // use IFileDialog as needed...
        pfd->Release();
    }
    else
    {
        // use GetOpenFileName() as needed...
    }
}
Run Code Online (Sandbox Code Playgroud)

不,IFileDialog不仅仅是针对C++.任何支持COM的语言都可以使用它,包括C,C++,Delphi,VisualBasic等.