|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.12.2012, 11:12 | #1 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
COM-серверы, Type Library и приведение типов
Работал с com-объектами постаринке, через OleVariant. Вздумалось использовать библиотеку типов. Ну там всё понятно, вопрос из другой оперы. Начнем с кода:
Код:
А вот так Код:
"Объясните мама с папой что к чему" AS, насколько я понимаю, занимается проверкой а потом уже приведением типа. Но если это сработало первые 100000 раз с as и мы больше ни чего не меняем, то можно не парится с проверками. Ан нет. Прямое приведение приводит к тому, что "Интерфейс не поддерживается" Вот кстати, нашел вот это Цитата:
http://www.transl-gunsmoker.ru/2010/...g-post_12.html Но всеравно не понял Последний раз редактировалось Sibedir; 17.12.2012 в 11:31. |
|
17.12.2012, 11:31 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А вот что GunSmoker в своем блоге пишет
http://www.transl-gunsmoker.ru/2010/...g-post_12.html
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
17.12.2012, 11:46 | #3 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Уже сморел (см. выше), но не понял
|
17.12.2012, 12:08 | #4 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
ii as IIcadApplication = ii.QueryInterface
IIcadApplication(ii) = ничего не делает, пустая операция F1 QueryInterface, F1 Supports
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
17.12.2012, 21:29 | #5 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Ну наконец-то что-то стало прояснятся. Дома есть возможность поработать в RAD Studio. Там по F7 на строке
Код:
Меня обманула собственная логика. Я то думал, что если приведение типов жесткое, то оно жесткое, а оказалось для интерфейсов при "жесткое" приведении типов за дело берется Код:
Код:
Код:
Но оказывается, что если Код:
Код:
Код:
Ну вроде разобрался немного. Но ведь ты же, дурилка картонная, всеравно понимаешь, что надо через as приводить. Какого лешего тогда ты тут димагогию разводишь? Цитата:
спустя пару часов ----------------------------------------- или я опять чёт напутал? Последний раз редактировалось Sibedir; 17.12.2012 в 22:20. |
|
18.12.2012, 00:42 | #6 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Всё правильно понял.
1. IIcadApplication(ii) - это простое копирование. Соответственно, если в ii лежит что-то совместимое с IIcadApplication - это будет работать, не лежит - не будет. 2. as и Supports - это оболочки к QueryInterface. Они явно запрашивают нужную форму. Я только не пойму, зачем ты рвёшься делать IIcadApplication(ii). Жёсткое приведение типа - это большое "НЕТ" для работы с интерфейсами.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
18.12.2012, 01:24 | #7 | ||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Цитата:
пишем Код:
Если _Appl = id то выход иначе _Appl := id IIcadApplication._AddRef и всё Но не всё так просто. Вот так вот тоже как-то не работает Код:
а с объектами работало Цитата:
Последний раз редактировалось Sibedir; 18.12.2012 в 01:32. |
||
18.12.2012, 01:46 | #8 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Цитата:
Код:
Код:
Это будет работать только тогда, когда типы ii и _Appl действительно двоично совместимы, несмотря на формально разные типы. Само собой, "это работает" - этого ещё не означает. Работать может благодаря случайности. К примеру, в том же примере выше, Integer в себя примет Single и эта операция иногда даже может выдавать ожидаемый результат (скажем, для нуля). Но этого не достаточно, чтобы заключить, что Integer в памяти представляется так же, как Single. У Delphi есть исключения к правилам жёсткого преобразования типов (например, строки), но интерфейсы сюда не входят. Цитата:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
||
18.12.2012, 06:23 | #9 | |||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Цитата:
Код:
Код:
При подключении к COM-серверу по имени система обращается к CoZwcadApplication.Create. Ведь как становится понятно из http://www.rsdn.ru/article/com/comvs.xml Цитата:
Цитата:
Возвращает CoZwcadApplication.Create ссылку на IIcadApplicationDisp = dispinterface. Именно IIcadApplicationDisp, а не IIcadApplication (именно поэтому трюки с жестким приведением типов и IcadApplicationDisp дают положительный результат). Ведь dispinterface - ключевое звено в технологии Ole(-апп) (я так понял его для того и ввели, чтобы разработчики могли спокойно спать ночью после внесения изменений в ОМ в новой версии своего проекта, он сам с помошью Invoke найдет по индексу переехавшие методы) (такой своеобразный интерфейс интерфейсов). Но обернут он в IIcadApplication = interface(IDispatch) Код:
Теперь было бы неплохо, если бы всё это оказалось правдой Пожалуйста, пожалуйста, пожалуйста, скажите ему кто-нибудь что все это правда, иначе я его застрелю P.S.: Кстати, давно уже надо было выложить XCAD_TLB.zip P.P.S.: Кстати, IIcad - это потому, что Безымянный.JPG а так-то вообще Код:
Последний раз редактировалось Sibedir; 18.12.2012 в 06:32. |
|||
18.12.2012, 07:33 | #10 | |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Цитата:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
приведение типов??? | nikozavr | C# (си шарп) | 1 | 14.05.2011 22:29 |
NetUserAdd() приведение типов | disaer | Общие вопросы C/C++ | 2 | 12.05.2011 08:09 |
С - приведение типов | onewho | Общие вопросы C/C++ | 3 | 21.11.2010 00:12 |
View|Type Library | _-Re@l-_ | Общие вопросы Delphi | 0 | 31.07.2010 15:54 |
Приведение типов в Qt | mike_tihomirov | Qt и кроссплатформенное программирование С/С++ | 1 | 19.06.2010 13:14 |