示例:“打开”对话框

我们一直在使用的 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 调用由通用项对话框对象定义的方法。

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

下一个

管理对象的生存期

打开对话框示例