Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-47931
mazepa
2002-07-25 11:22
2002.08.15
SQL Help


14-48313
AlexRya
2002-07-22 22:43
2002.08.15
Как изменить меню загрузки?


1-48016
Brand
2002-07-31 00:53
2002.08.15
RichEdit + Memo


1-48153
lpp
2002-07-31 11:43
2002.08.15
Как сделать форму для ввода пароля?


1-48135
DikobraZ
2002-08-01 12:54
2002.08.15
TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский