示例:“打开”对话框

Shapes我们一直使用的示例在某种程度上是经过一些尝试的。 让我们转到可在实际 Windows 程序中使用的 COM 对象: “打开 ”对话框。

显示打开对话框的屏幕截图

若要显示“ 打开 ”对话框,程序可以使用名为“公共项对话框”对象的 COM 对象。 通用项对话框实现名为 IFileOpenDialog 的接口,该接口在头文件 Shobjidl.h 中声明。

下面是向用户显示“ 打开 ”对话框的程序。 如果用户选择文件,程序将显示一个包含文件名的对话框。

#include <windows.h>
#include <shobjidl.h> 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | 
        COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        IFileOpenDialog *pFileOpen;

        // Create the FileOpenDialog object.
        hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, 
                IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen));

        if (SUCCEEDED(hr))
        {
            // Show the Open dialog box.
            hr = pFileOpen->Show(NULL);

            // Get the file name from the dialog box.
            if (SUCCEEDED(hr))
            {
                IShellItem *pItem;
                hr = pFileOpen->GetResult(&pItem);
                if (SUCCEEDED(hr))
                {
                    PWSTR pszFilePath;
                    hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);

                    // Display the file name to the user.
                    if (SUCCEEDED(hr))
                    {
                        MessageBoxW(NULL, pszFilePath, L"File Path", MB_OK);
                        CoTaskMemFree(pszFilePath);
                    }
                    pItem->Release();
                }
            }
            pFileOpen->Release();
        }
        CoUninitialize();
    }
    return 0;
}

此代码使用稍后将在模块中介绍的一些概念,因此,如果你不了解此处的所有内容,请不要担心。 下面是代码的基本概述:

  1. 调用 CoInitializeEx 以初始化 COM 库。
  2. 调用 CoCreateInstance 以创建 Common Item Dialog 对象,并获取指向对象的 IFileOpenDialog 接口的指针。
  3. 调用对象的 Show 方法,该方法向用户显示对话框。 此方法会阻止,直到用户关闭对话框。
  4. 调用对象的 GetResult 方法。 此方法返回指向第二个 COM 对象的指针,称为 Shell 项 对象。 实现 IShellItem 接口的 Shell 项表示用户选择的文件。
  5. 调用 Shell 项的 GetDisplayName 方法。 此方法以字符串的形式获取文件路径。
  6. 显示显示文件路径的消息框。
  7. 调用 CoUninitialize 可取消初始化 COM 库。

步骤 1、2 和 7 调用 COM 库定义的函数。 这些是泛型 COM 函数。 步骤 3-5 调用由 Common Item Dialog 对象定义的方法。

此示例演示对象创建的品种:泛型 CoCreateInstance 函数,以及特定于 Common Item Dialog 对象的 GetResult) 方法 (。

下一步

管理对象的生存期

“打开”对话框示例