hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0);
if (SUCCEEDED(hr)) {
// 4. Если GetWallpaper завершился успешно, выводим полученное имя файла.
// Заметьте, что я использую wcout для отображения Unicode-строки wszWallpaper.
// wcout является Unicode-эквивалентом cout.
wcout << L"Wallpaper path is:\n " << wszWallpaper << endl << endl;
} else {
cout << _T("GetWallpaper failed.") << endl << endl;
}
// 5. Освобождаем интерфейс.
pIAD->Release;
} else {
cout << _T("CoCreateInstance failed.") << endl << endl;
}
// 6. Разинициализируем библиотеку COM. В приложениях MFC этого не требуется –
// MFC делает это автоматически.
CoUninitialize;
В этом примере я использовал std::wcout для отображения строки Unicode wszWallpaper.
Второй пример показывает, как можно использовать QueryInterface для получения единственного интерфейса COM-объекта. В этом примере используется CO-класс Shell Link, содержащийся в оболочке, для создания ярлыка для файла "обоев", имя которого мы получили в предыдущем примере.
Программа состоит из следующих шагов:
1. Инициализация библиотеки COM.
2. Создание объекта COM, используемого для создания ярлыков, и получение интерфейса IShellLink.
3. Вызов метода SetPath интерфейса IShellLink.
4. Вызов метода QueryInterface объекта COM и получение интерфейса IPersistFile.
5. Вызов метода Save интерфейса IPersistFile.
6. Освобождение интерфейсов.
7. Разинициализация библиотеки COM.
CString sWallpaper = wszWallpaper; // Конвертация пути к "обоям" в ANSI
IShellLink* pISL;
IPersistFile* pIPF;
// 1. Инициализация библиотеки COM (заставляем Windows загрузить библиотеки DLL). Обычно
// вам нужно делать это в функции InitInstance или подобной ей. В MFC-приложениях
// можно также использовать функцию AfxOleInit.
CoInitialize(NULL);
// 2. Создание объекта COM с использованием CO-класса Shell Link, поставляемого оболочкой.
// 4-й параметр указывает на то, какой интерфейс нам нужен (IShellLink).
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pISL);
if (SUCCEEDED(hr)) {
// 3. Устанавливаем путь, на который будет указывать ярлык (к файлу "обоев").
hr = pISL->SetPath(sWallpaper);
if (SUCCEEDED(hr)) {
// 4. Получение второго интерфейса (IPersistFile) от объекта COM.
hr = pISL->QueryInterface(IID_IPersistFile, (void**)&pIPF);
if (SUCCEEDED(hr)) {
// 5. Вызов метода Save для сохранения ярлыка в файл. Первый параметр
// является строкой Unicode.
hr = pIPF->Save(L"C:\\wallpaper.lnk", FALSE);
// 6a. Освобождение интерфейса IPersistFile.
pIPF->Release;
}
}
// 6b. Освобождение интерфейса IShellLink.
pISL->Release;
}
// Где-то здесь должен быть код для обработки ошибок.
// 7. Разинициализация библиотеки COM. В приложениях MFC этого делать
// не нужно, т.к. MFC справляется с этим сама.
CoUninitialize;