Пример: диалоговое окно "Открыть"

Пример Shapes , который мы использовали, несколько надуман. Давайте обратимся к COM-объекту, который можно использовать в реальной программе Windows: диалоговое окно Открыть .

Снимок экрана: открытое диалоговое окно

Чтобы отобразить диалоговое окно Открыть , программа может использовать 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 , чтобы создать объект Диалоговое окно общего элемента и получить указатель на интерфейс IFileOpenDialog объекта.
  3. Вызовите метод Show объекта, который отображает диалоговое окно для пользователя. Этот метод блокируется, пока пользователь не закроет диалоговое окно.
  4. Вызовите метод GetResult объекта. Этот метод возвращает указатель на второй COM-объект, называемый объектом элемента оболочки . Элемент оболочки, реализующий интерфейс IShellItem , представляет файл, выбранный пользователем.
  5. Вызовите метод GetDisplayName элемента оболочки. Этот метод получает путь к файлу в виде строки.
  6. Отображение окна сообщения, в котором отображается путь к файлу.
  7. Вызовите CoUninitialize , чтобы не инициализировать библиотеку COM.

Шаги 1, 2 и 7 вызывают функции, определенные библиотекой COM. Это универсальные функции COM. Шаги 3–5 вызывают методы, определенные объектом диалогового окна "Общий элемент".

В этом примере показаны оба варианта создания объекта: универсальная функция CoCreateInstance и метод (GetResult), относящееся к объекту Common Item Dialog.

Следующая

Управление временем существования объекта

Пример открытия диалогового окна