Форум: "WinAPI";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
ВнизCOM. Сервера Автоматизации 1. Найти похожие ветки
← →
_Antiox_ (2002-06-10 11:12) [0]При создании сервера автоматизации Wizard создаёт файл типа xxx_TLB.pas,
который, по сути, есть не что иное как файл интерфейса.
Припрограммировании клиента мы в секции uses добавляем xxx_TLB.
Вопрос состоит в следующем - если сервер написан не на OPascal, а к примеру на С++,
то TLB файл придётся переделывать ручками. Это очень неприятный процесс, учитывая размеры TLB файлов у
интерфейсов с большим числом методов.
Нет ли какого нибудь конвертера P2C или чего-нибудь подобного?
← →
Digitman (2002-06-10 11:28) [1]если СА уже создан, зачем тебе это нужно ?
а если уже создан, то для программирования КА достаточно выполнить импорт его существующей библиотеки типов средствами той языковой среды, в которой создается КА. Если это С++, импорт осуществляется в синтаксисе IDL.
← →
_Antiox_ (2002-06-10 14:33) [2]>Digitman:
>> "...импорт осуществляется в синтаксисе IDL. "
Вот! Спасибо, то что надо!
Если можно, то ещё один вопрос (что бы ветки не плодить):
В созданном xxx_TLB.pas имеются следующие строки:
...
CoMyProj = class
class function Create: IMyProj;
...
end;
...
class function CoMyProj.Create: IMyProj;
begin
Result:= CreateComObject(Class_MyProj) as IMyProj;
end;
Т.е., как я понял, конструктор создаёт интерфейс фабрики классов для моих объектов - это так?
И, если не сложно, объясни этот немного режущий глаз механизм приведения типов с as.
Я знаю что он нужен и для чего он нужен, но как это работает не понимаю :(
Огромное спасибо за ответ.
← →
Digitman (2002-06-10 15:39) [3]Функц.метод класса CoMyProj.Create() реализует конструирование экземпляра класса с указанным CLSID, а не фабрики данного класса. Успешным результатом работы метода явл-ся интерфейс объекта с запрошенным CLSID.
Приведение типов AS нужно, потому что ф-ция CreateComObject() всегда возвращаяет интерфейс IUnknown, обязательный к реализации для любых объектов автоматизации (прародитель всех интерфейсов автоматизации, предоставляющий 3 обязательных базовых метода : _AddRef, _Release и QueryInterface), а результатом работы метода CoMyProj.Create() д.б. интерфейс типа IMyProj. В процессе преобразования происходит неявный вызов IUnknown.QueryInterface(), и, в случае доступности интерфейса IMyProj у вновь созданного
объекта с запрошенным clsid, возвращается уже собственно интерфейс IMyProj (он всегда есть прямой или непрямой наследник интерфейса IUnknown и предоставляет все останьные методы/св-ва кроме собственно предоставляемых интерфейсом IUnknown)
← →
_Antiox_ (2002-06-10 16:21) [4]> Digitman © (10.06.02 15:39):
1. Ясно.
2. Кажется понял. Читал об этом, но представить в "физике" не мог никак , теперь всё ясно (imho ;)
Т.о. созданный объект непосредственно не реализует всех внутренних интерфейсов, а передаёт ссылки с помощью QueryInterface.
Пошёл перечитывать и переосмыслять теорию.
Спасибо!
← →
Digitman (2002-06-10 17:49) [5]2.
Не совсем так.
Успешно созданный вызовом CreateComObject() COM-объект ОБЯЗАН предоставлять и реализовать интерфейс IUnknown, но может реализовывать и предоставлять более чем один (базовый, т.е. IUnknown) интерфейс. Какой конкретно интерфейс созданного объекта потребуется вызывающему коду, ф-ции CreateComObject() заранее неизвестно, поэтому она возвращает базовый интерфейс.
Преобразование же AS как раз и нужно для неявного запроса вызывающим кодом через полученный сим образом базовый интерфейс IUnknown созданного соответствующей фабрикой объекта нужный ему (вызывающему коду) расширенный интерфейс, реализующий собственно требуемую (декларированную и ожидаемую, согласно TLB) функциональность вызываемого объекта в рамках этого самого расширенного интерейса.
← →
_Antiox_ (2002-06-11 13:40) [6]>Digitman © (10.06.02 17:49)
Спасибо. Вчера перечитал классиков - с AS разобрался благодаря твоим разъяснениям :)
>> ...импорт осуществляется в синтаксисе IDL.
Хотя зачем? Всё равно при разработке К.А. (в Delphi) нам будет необходим pas файл, из которого наш К.А. "узнает" об объекте и его интерфейсах (какие ф-ии существуют в каждом интерфейсе, какие аргументы они принимают и т.д.).
Оказывается с Delphi идёт утилитка TLIBIMP.exe, которая на основе существующей библиотеки типов (xxx.TLB) делает делфёвый эквивалент "интерфейсного" файла (т.е. Pascal-трансляцию).
Именно об этом я в сущности и спрашивал в самом начале (help надо было лучше читать мне :)
А экспортировать в IDL-файл стоит тогда, когда надо перевести в С++, как я понял.
MIDL.exe, судя по help-у, справляется с этим неплохо.
Ещё один вопрос:
при рассмотрении примеров заметил такую деталь: при создании экземпляра сервера автоматизации с помощью интерфейсов (а не dispinterface-ов) зачастую используется именно
...
IMyInts:= CreateComObject(CLASS_IPS) as IIPS;
...
А почему сразу не
???
...
IMyInts:= CoIPS.Create; // ведь этот конструктор уже реализован в xxx_TLB.pas
...
По идее варианты абсолютно идентичны в данном случае (именно при использовании интерфейсов) или же в использовании CreateComObject всё же есть какой-то смысл?
← →
Digitman (2002-06-11 14:28) [7]Варианты абсолютно идентичны. Никакой разницы нет. Просто xxx_TLB.pas-генератор для удобства дальнейшего пользования делает шаблон декларации и реализации конструктора конкретного класса : при его использовании нет необходимости явно выполнять AS-преобразование, поскольку оно уже реализовано в этом конструкторе. Ты волен пользоваться или не пользоваться этой заготовкой при конструировании COM-объекта
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c