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

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

Жанры

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

Легалов А. И.

Шрифт:

Здесь самая лучшая часть истории. Вы могли бы подумать: «О, право, большое дело! Легко придумать эти идеи теперь, после того, как OLE находится на рынке для почти десятилетие». Сообщаю, что искренне Ваш был тем, кто работал когда-то в Microsoft. Вскоре, после выпуска OLE 1.0, я записал эти идеи и послал ответственным людям. Короче говоря, идеи были приняты как допустимые, но отклонены, потому что уже имелось слишком много кода, записанного в спецификациях OLE (обычное дело в Microsoft). Никто из менеджеров не пожелал рисковать, перепроектируя OLE.

Итак, теперь мы имеем

подсчет ссылок, агрегацию и все прочее. Мораль истории:

Нет ничего святого, что касается OLE. Это может быть сделано лучше!

Но мы все же можем иметь пирог и есть его? Другими словами, можно формировать «интеллектуальное OLE» на вершине «другого OLE»? Ваша ставка! Идите прямо к следующей обучающей программе .

Оболочка из классов для OLE

Рационализация OLE

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

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

Построив интеллектуальное OLE на вершине старого, Вы узнаете другое OLE

Прежде всего Вы должны сообщить миру, что собираетесь использовать OLE. Имеется небольшой класс, который будет делать это за Вас. Только внедрите объект этого класса в некоторый высокоуровневый сконструированный объект прежде, чем Вы что-либо сделаете с OLE и удалите его после того, как отработаете с OLE. В Windows программе первоосновой для UseOle является «Контроллер».

class UseOle {

public:

 UseOle { OleInitialize (0); }

 ~UseOle { OleUninitialize ; }

};

class Controller {

public:

 Controller(HWND hwnd, CREATESTRUCT* pCreate);

 ~Controller { PostQuitMessage(0); }

 void Paint(HWND hwnd);

private:

 UseOle useOle;

};

Затем Вы должны создать OLE объект, который является поставщиком интерфейсов. Абстрактный класс CoObject объявляет метод AcquireInterface. Фактический класс SObject (интеллектуальный объект) обеспечивает одну специфическую реализацию CoObject, которая использует, внутри себя, позорящий OLE IUnknown.

class CoObject {

public:

 virtual void* AcquireInterface (IID const& iid) = 0;

};

class SObject: public CoObject {

public:

 SObject(CLSID const& classId, bool running = false);

 ~SObject {

if (_iUnk) _iUnk-> Release ;

 }

 void* AcquireInterface(IID const& iid);

private:

 IUnknown * _iUnk;

};

Давайте

взглянем на реализации конструктора и метода AcquireInterface.

Конструктор получает объект, вызывая функцию API GetActiveObject и/или CoCreateInstance. Различие между ними в том, что GetActiveObject пытается овладеть уже выполняющимся объектом, в то время как CoCreateInstance пробует то же самое, но, если это терпит неудачу, то запускает любой exe-шник, необходимый для выполнения этого объекта. Некоторые объекты фактически определяют предпочтение: они хотят, чтобы новый сервер был заново запущен каждый раз, когда вызывается CoCreateInstance. GetActiveObject позволяет Вам обойти это.

Обратите внимание, что это — только один пример того, как Вы получаете доступ к OLE объектам. Вы можете захотеть поиграть с некоторыми из параметров. Например, я передаю CLSCTX_SERVER как параметр в CoCreateInstance. Это даст мне уверенность, что объект будет жить в отдельном от клиента процессе. Во многих случаях вам лучше иметь объект как сервер в процессе на основе DLL, которая загружается в адресное пространство клиента. Для больших подробностей ищите описание CoCreateInstance в вашей справке.

SObject::SObject(CLSID cons & classId, bool running) :_iUnk (0) {

 HRESULT hr = S_OK;

 if (running) {

::GetActiveObject(classid, 0, &_iunk);

 }

 if (_iUnk == 0) {

hr = ::CoCreateInstance(classId, 0, CLSCTX_SERVER, IID_IUnknown, (void**)&_iUnk);

 }

 if (FAILED(hr)) throw HEx(hr, "Couldn't create instance");

}

Через мгновение я объясню странный тип исключения HEx.

В нашей реализации AcquireInterface просто вызывает метод QueryInterface из IUnknown (или, как я говорю, неудачный QueryInterface из неудачного IUnknown).

void* SObject::AcquireInterface(IID const& iid) {

 void * p = 0;

 HRESULT hr = _iUnk->QueryInterface(iid, &p);

 if (FAILED(hr)) {

if (hr == E_NOINTERFACE) throw "No such interface";

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

Черный дембель. Часть 5

Федин Андрей Анатольевич
5. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 5

30 сребреников

Распопов Дмитрий Викторович
1. 30 сребреников
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
30 сребреников

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Охота на разведенку

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
6.76
рейтинг книги
Охота на разведенку

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Надуй щеки! Том 3

Вишневский Сергей Викторович
3. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 3

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

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Хозяйка дома в «Гиблых Пределах»

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.75
рейтинг книги
Хозяйка дома в «Гиблых Пределах»