|
|
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
Всем привет Стал экспериментировать с поздним связыванием в Variant Хочется заполнять такие Variant, которые будут работать по аналогии с OleAutomation Выяснил, что нужно создать экземпляр IDispatch и присвоить его варианту С TInterfacedObject всё понятно, но как заполнять специфичные функции - пока не осилил. Доку читал Кто сталкивался или хотя бы догадывается, как надо реализовывать, давайте разберёмся. Предлагаю в качестве теста реализовать следующий "интерфейс": Код: pascal 1. 2. На всякий случай повторяю интерфейс IDispatch: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2017, 17:02:30 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUХочется заполнять такие Variant, которые будут работать по аналогии с OleAutomation Мой тебе совет, если не нужен именно IDispatch, то просто возьми TInvokeableVariantType. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2017, 17:19:59 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Огонь, спасибо! То что нужно С другой стороны делается очень много реаллоков памяти, что не есть гуд И разобраться с IDispatch будет интересно Так что если кому интересно - подключайтесь ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2017, 17:51:42 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUИ разобраться с IDispatch будет интересно Там всё просто. Первые два метода можно не реализовывать (result := E_NOTIMPL). GetIDsOfNames должен уметь возвращать числовой идентификатор(ы) по имени сущности (метода или свойства). Invoke должен по числовому идентификатору оперировать сущностью. Например, вызов метода от варианта хранящего IDispatch сводится в вызову этих двух методов: сперва по имени запрашивается идентификатор, потом по идентификатору просят сделать вызов. Если вызовы происходят через dispinterface, то для сущностей у которых указан идентификатор (dispId) запрос идентификатора делаться не будет, а будет сразу запрос на вызов. Общий принцип работы такой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2017, 18:35:57 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, С GetIDsOfNames я разобрался Не понятно только, зачем массив имён И зачем Delphi для вызова с поздним связыванием делает столько вещей: создаёт массив WideString, заполняет из UTF8. А зачем вообще первые два метода? И с Invoke, конечно, треш. Как определить, это GetProperty или SetProperty, есть ли в этом свойстве параметр, или это функция, или процедура? С TInvokableVariantType как-то всё проще :). Кстати да, Variant-вызов позволяет явно указать аргументы, которые ты заполняешь. Как их (имена/значения) узнать в Invoke? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 07:53:48 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
В общем, Invoke можно сделать по аналогии с TInvokableVariantType И вообще, если говорить о скорости, то лучше делать свой TCustomVariantType и переопределять Invoke, там имя можно найти в PAnsiChar и не преобразовывать в Unicode/WideString. А для сложных типов проще конечно взять TInvokableVariantType Вопрос закрыт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 11:39:37 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUKazantsev Alexey, С GetIDsOfNames я разобрался Не понятно только, зачем массив имён И зачем Delphi для вызова с поздним связыванием делает столько вещей: создаёт массив WideString, заполняет из UTF8. А зачем вообще первые два метода? И с Invoke, конечно, треш. Как определить, это GetProperty или SetProperty, есть ли в этом свойстве параметр, или это функция, или процедура? С TInvokableVariantType как-то всё проще :). Кстати да, Variant-вызов позволяет явно указать аргументы, которые ты заполняешь. Как их (имена/значения) узнать в Invoke? Например, очень крутой тип TDocVariant в Synopse реализован именно через TInvokeableVariantType. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 11:52:17 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНе понятно только, зачем массив имён Чтобы за один вызов можно было получить несколько идентификаторов. Я сейчас не помню, как именно поступает дельфя в случае вызова: Код: pascal 1. но, это, один из тех случаев, когда идентификаторы можно запросить одним вызовом. SOFT FOR YOUИ зачем Delphi для вызова с поздним связыванием делает столько вещей: создаёт массив WideString, заполняет из UTF8. IDispatch это системный интерфейс. В виндах он является основным интерфейсом автоматизации. Поэтому всё делается исходя из требований предъявляемых к таким интерфейсам (WideString, OleVariant; всё для совместимости с системными требованиями). Этот интерфейс можно использовать вне процесса, поэтому без безопасных типов тут не обойтись. SOFT FOR YOUА зачем вообще первые два метода? Для того, чтобы объект автоматизации мог экспортировать информацию о самом себе и используемых им типов. SOFT FOR YOUИ с Invoke, конечно, треш. Как определить, это GetProperty или SetProperty, есть ли в этом свойстве параметр, или это функция, или процедура? Всё определяется параметрами передаваемыми в Invoke. SOFT FOR YOUИ вообще, если говорить о скорости, то лучше делать свой TCustomVariantType и переопределять Invoke, там имя можно найти в PAnsiChar и не преобразовывать в Unicode/WideString. Если уж говорить о скорости, то работа с IDispatch через dispinterface, наверняка, порвёт всё прочие варианты: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 12:26:47 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
В System.Win.ObjComAuto есть TObjectDispatch который реализует IDispatch Вот пример: http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/TObjectDispatchInvoke_(Delphi) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 15:44:23 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
X-CiteВ System.Win.ObjComAuto есть TObjectDispatch который реализует IDispatch Вот пример: http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/TObjectDispatchInvoke_(Delphi) точно, он вроде бы ещё с Delphi 7 идёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 17:37:45 |
|
||
|
IDispatch: делаем класс
|
|||
|---|---|---|---|
|
#18+
Самое забавное, что TInvokeableVariantType есть ещё в Delphi 7 Интересно, с какой Delphi он появился ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 19:04:54 |
|
||
|
|

start [/forum/topic.php?fid=58&tid=2041452]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
224ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 196ms |
| total: | 531ms |

| 0 / 0 |
