Чтение онлайн

на главную - закладки

Жанры

Применение Windows API

Легалов А. И.

Шрифт:

else throw HEx(hr, "Couldn't acquire interface");

 }

 return p;

}

Метод AcquireInterface — один из этих исключительных, Получающих методов Управления ресурсами, которые освобождают ресурсы. Мы не вызываем его иначе, как внутри конструктора интеллектуального указателя интерфейса. (Между прочим, параметр шаблона — это IID указатель, потому что компилятор не будет принимать ссылки как параметры шаблона. Я не уверен почему.)

Итак, имеется шаблон для интеллектуального

указателя интерфейса.

template<class I, IID const * iid>

class SFace {

public:

 ~SFace {

if (_i) _i-> Release;

 }

 I* operator-> { return _i; }

protected:

 SFace : _i(0) {}

 SFace(void * i) {

_i = static_cast<I*>(i);

 }

protected:

 I * _i;

};

Как видите, этот специфический шаблон не может порождать экземпляры. Дело в том, что все его конструкторы защищены. Но не волнуйтесь, мы создадим другие классы, которые обеспечим их собственными специализированными конструкторами.

Вот один из них, который использует наш CoObject (или любой другой объект, полученный от него) как источник интерфейса.

template<class I, IID const * iid>

class SObjFace: public SFace<I, iid> {

public:

 SObjFace(CoObject& obj) : SFace<I, iid>(obj.AcquireInterface(*iid)) {}

};

В заключение позвольте мне представить класс HEx (HRESULT Exception). Это — класс исключения, который является способным к отображению значимых сообщений об ошибках. Для достижения моих ограниченных целей, я просто отображаю сообщения непосредственно на холсте основного экрана. Не бойтесь реализовать ваш собственный метод с использованием окна сообщений или еще чего-нибудь.

class HEx {

public:

 HEx(HRESULT hr, char const * str = 0) : _hr (hr), _str (str) {}

 void Display(int x, int y, Canvas& canvas) {

if (_str != 0) {

canvas.Text (x, y, _str);

y += 20;

}

if (FAILED (_hr)) {

char * msg;

::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, _hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<char*>(&msg), 0, 0);

canvas.Text(x, y, msg);

::LocalFree(msg);

}

 }

private:

 HRESULT _hr;

 char const * _str;

};

Далее:

Будет представлен типичный код. Я только должен объяснить, что такое Автоматизация .

Обертка для автоматизации

Автоматизация

Перевод А. И. Легалова

Англоязычный оригинал находится на сервере компании Reliable Software

Мне бы хотелось получить море информации из запущенной копии Microsoft Developers Studio. Это должно быть простой задачей, т.к. DevStudio, подобно многим другим приложениям MS, предоставляет его интерфейсы через OLE Автоматизацию. Не столь просто! Как Вы увидите, Microsoft решил, что клиенты интерфейсов автоматизации VC ++ будет или использовать Visual Basic, или внутренних умных мастеров DevStudio. Я, с другой стороны, люблю программировать на C++ (Вам не кажется, что Microsoft Visual C++ должен быть переименован в Microsoft Visual MFC Wizard? Это принизило C++ до роли языка сценариев для MFC.)

В любом случае, когда я выяснил, как надо делать, остальное оказалось не быть слишком трудным. Вы только должны выяснить, где вся необходимая информация сохраняется в реестре. В частности IID всех интерфейсов. Совет: используйте OLE-COM Object Viewer, который поставляется с VC ++, чтобы просмотреть библиотеки типов. Было бы вообще великолепно, если бы Microsoft предоставлял исходные файлы или obj файлы с определениями идентификаторов интерфейсов. В существующей же ситуации я должен копировать их из Object Viewer'а и вставлять их в нужное место. Ниже приводится пример.

static const IID IID_IApplication = { 

 0xEC1D73A1, 0x8CC4, 0x11CF, { 0x9B, 0xE9, 0x00, 0xA0, 0xC9, 0x0A, 0x63, 0x2C }

};

Итак, как получить управление выполняющейся копией DevStudio? В начале вы должны создать OLE объект. Для этого необходим идентификатор класса этого объекта. Вы можете получить идентификатор класса от системы (эта информация хранится в реестре), если знаете программный идентификатор. Программный идентификатор, устроен так чтобы читаться человеком. Конечно, каждый человек знает, что Developer Studio идет под именем "MSDEV.APPLICATION". Это так просто.

Имея идентификатор класса, мы можем создать наш SObject. Мы передаем значение параметра запуска как true, потому что хотим соединиться с выполняющейся копией MSDEV.APPLICATION, если это возможно. Получение интерфейса из SObject столь же просто как создание экземпляра шаблона SObjFace с соответствующими параметрами. Итак, нашей отправной точкой будет, интерфейс к приложению.

CLSID idMsDev;

HRESULT hr = ::CLSIDFromProgID(L"MSDEV.APPLICATION", &idMsDev);

Поделиться:
Популярные книги

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь