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

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

Жанры

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

Легалов А. И.

Шрифт:

return dispid;

 }

 void GetProperty(DISPID propId, VARIANT& result) {

// In parameters

DISPPARAMS args = { 0, 0, 0, 0 };

EXCEPINFO except;

UINT argErr;

HRESULT hr = _iDisp->Invoke(propId, IID_NULL, GetUserDefaultLCID, DISPATCH_PROPERTYGET, &args, &result, &except, &argErr);

if (FAILED (hr)) throw HEx(hr, "Couldn't get property");

 }

 void* AcquireInterface(IID const & iid) {

void* p = 0;

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

if (FAILED(hr)) {

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

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

}

return p;

 }

protected:

 DispObject(IDispatch * iDisp) : _iDisp(iDisp) {}

 DispObject : _iDisp(0) {}

protected:

 IDispatch* _iDisp;

};

Ниже

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

// Use docObj as a dispatch interface

DISPID pid = docObj.GetDispId(L"Name");

VARIANT varResult;

::VariantInit(&varResult);

docObj.GetProperty(pid, varResult);

BString bName(varResult);

CString cName(bName);

canvas.Text(20, y, "Name:");

canvas.Text(200, y, cName);

Это показывает, как Вы получаете путь, используя таблицу виртуальных функций (vtable).

SObjFace<IGenericDocument, &IID_IGenericDocument> doc(docObj);

BString bPath;

doc->get_FullName(bPath.GetPointer);

Теперь у Вас не должно быть каких-либо проблем при понимании кода, который определяет номер строки, на которой пользователь позиционировал курсор.

BString bType;

doc->get_Type(bType.GetPointer);

if (type.IsEqual("Text")) {

 SObjFace<ITextDocument, &IID_ITextDocument> text (docObj);

 SSelection selObj(text);

 SObjFace<ITextSelection, &IID_ITextSelection> sel(selObj);

 long line;

 sel->get_CurrentLine(&line);

 canvas.Text(20, y, "CurrentLine:");

 char buf[10];

 wsprintf(buf, "%ld", line);

 canvas.Text(200, y, buf);

}

SSelection —

это DispObject, который может быть получен, вызовом метода get_Selection интерфейса текстового документа.

class SSelection: public DispObject {

public:

 SSelection(SObjFace<ITextDocument, &IID_ITextDocument>& doc) {

HRESULT hr = doc->get_Selection(& _iDisp);

if (FAILED(hr)) throw HEx(hr, "get_Selection failed");

 }

};

У Вас могут быть небольшие трудности, если это — ваш первый контакт с OLE (преуменьшение!). Поэтому, ниже подводятся некоторые итоги, которые суммируют различные действия, позволяющие упростить задачу Автоматизации. Обратите внимание, что это — клиентская сторона уравнения. Если Вы хотите, чтобы ваше приложение было сервером Автоматизации, то ожидайте некоторых усложнений. Хорошо то, что имеется большое количество литературы по этим вопросам.

Итак здесь изложено то, что Вы должны сделать.

• Исследование

 ○ Проведите поиск в вашем реестре (используя RegEdt32 или OLE/COM object viewer) чтобы найти ProgID приложения, которым Вы хотите овладеть. HKEY_CLASSES_ROOT — отправная точка. Вы увидите там такие ключи как Word.Application, Excel.Application и многие другие.

 ○ Отыщите библиотеки типов, используя OLE/COM object viewer. Они предоставят идентификаторы классов и идентификаторы интерфейсов, которые Вы должны скопировать и вставить в ваш код.

 ○ Найдите заголовочные файлы для этих интерфейсов.

• В вашей программе: Преобразуйте ProgID в ClassID.

• Чтобы соединяться с выполняющимся приложением или активизировать новый экземпляр, создайте SObject, используя ClassID.

• Получите интерфейс IApplication из объекта (используйте шаблон IObjFace).

 ○ Используйте этот интерфейс, чтобы получить доступ к другим объектам внутри приложения. Для каждого такого объекта:

 ○ Объявите класс, наследующий от DispObject.

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

Моров. Том 5

Кощеев Владимир
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 5

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Требую развода! Что значит- вы отказываетесь?

Мамлеева Наталья
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Требую развода! Что значит- вы отказываетесь?

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Изыскатель

Назимов Константин Геннадьевич
5. Травник
Фантастика:
фэнтези
7.00
рейтинг книги
Изыскатель

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

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

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

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Хозяин Стужи 8

Петров Максим Николаевич
8. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 8

Третье правило диверсанта

Бычков Михаил Владимирович
Фантастика:
постапокалипсис
5.67
рейтинг книги
Третье правило диверсанта