Читаем Программирование на Visual C++. Архив рассылки полностью

 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.

Использование COM-объекта, включающего несколько интерфейсов

Второй пример показывает, как можно использовать 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;

Литература


Essential COM, Don Box, ISBN 0-201-63446-5.

MFC Internals, George Shepherd and Scot Wingo, ISBN 0-201-40721-3.

Beginning ATL 3 COM Programming, Richard Grimes, ISBN 1-861001-20-7.

ВОПРОС-ОТВЕТ 

Перейти на страницу:

Похожие книги

Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам.Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.

Скотт Майерс , Скотт Мейерс

Программирование, программы, базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT