Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];

Вниз

COM. Раннее связывание и ID-связывание. Есть ли реальное отличие?   Найти похожие ветки 

 
Набережных С.   (2002-09-20 15:21) [40]

Здравия желаю!

Когда вызов приходит в заглушку, в ней вызывается метод IRpcStubBuffer.Invoke(var msg:TRPCOLEMESSAGE, Channel:IRpcChannelBuffer), в котором первый параметр - отправленный из прокси через метод IRpcChannelBuffer.SendReceive.
А в структуре TRPCOLEMESSAGE есть поле iMethod, фамилия говорит сама за себя. Но это чисто маршаллинговый внутренний идентификатор, не имеющий отношения к тем, с которыми мы имеем дело в клиенте и сервере. При самостоятельной реализации вы вольны заполнить структуру как вам заблагорассудится - лишь бы потом смогли это понять в заглушке:)

Теперь по поводу стандартного маршаллера. Не имел случая разобраться досконально, поэтому стопроцентно утверждать не могу. Но есть довольно обоснованное подозрение, что он генерит oicf - строки на основании инфы из TLB, которые и используются при маршаллинге VTbl-вызовов. ИМХО.


 
Digitman   (2002-09-20 15:28) [41]

>Набережных С.

Может, я не очень удачно изложил свое понимание, но оно совпадает с тем, о чем ты говоришь ! Хоть я и не трассировал вызов при таком раскладе - это понятно интуитивно !


 
vuk   (2002-09-20 15:37) [42]

>а RPC ,по-твоему, не имеет никакого отношения к маршаллингу ?
Я что, утверждал обратное? Конечно имеет. Только вот это маршалинг не COM, а RPC. А единственное, с чем я спорю - это Ваши утверждения о том, что через пределы процесса не возможен VTbl вызов и тем, что маршалинг завязан на механизмы диспинтерфейсов.


 
Digitman   (2002-09-20 15:44) [43]

>vuk

Как бы там ни было, мы тут все же - о раннем и позднем связывании.
Вот и RPC тоже ведет к Invoke(). Пусть и не относящемуся к классическим дисаинтерфейсам.

И что ? Это - раннее связывание ? Или таки - позднее ?))


 
Набережных С.   (2002-09-20 15:47) [44]


> Digitman © (20.09.02 15:28)

Ну так я и не говорил, что ты ошибаешься:))) Просто изложил положение вещей... Действително, трудно придумать способ распознования методов более удобный, чем целочисленный идентификатор:)


 
vuk   (2002-09-20 15:58) [45]

Звиняйте, дяденьки... В случае позднего связывания в COM решение о том, какой именно метод вызывать и как параметры подставлять принимает сервер автоматизации (пара GetIDsOfNames/Invoke)... Здесь же что-то другое получается...


 
Digitman   (2002-09-20 16:03) [46]

>Набережных С.

Я ведь тоже просто изложил свое понимание вещей) ...

>vuk

Не стоит звынений !) ... Мы ведь просто ищем истину) ... А истина здесь весьма расплывчата ...


 
vuk   (2002-09-20 16:11) [47]

Ведь что получается, если позднее связывание в COM Automation - это все что ходит через IDispatch.Invoke, то вызов VTable интерфейса через границу процессов не будет являться поздним связыванием.


 
Digitman   (2002-09-20 16:30) [48]

>vuk

Это - да. Но - по определению MS. Не вдающегося в подробности. А на деле получается, что тот же в принципе Invoke() (но - в RPC) при разных условиях взаимодействия К. и С. всегда выглядит как методология ранее связывания, хотя IDispatch.Invoke() почему-то всегда ассоциируется с поздним. Разница-то какая с т.з. эффективности ? Да никакой на деле получается ! И там и там (тем или иным образом) фигурирует ID метода, разрешаемый в факт.адрес при исполнении Invoke().... Выигрыш в производительности за счет непосредственного обращения К. к заглушке сводится на нет тем или иным механизмом маршаллинга, без которого в принципе никак не обойтись...


 
Romkin   (2002-09-20 16:43) [49]

Ж-)) ДА что тут искать? позднее связывание, как и IDispatch, было введено MS для того, чтобы программисты на VB могли делать вызовы к COM (а VB понятия не имеет о структуре VTBL). Ухи-то торчат! Достаточно посмотреть на параметры Invoke... В каком еще языке можно делать вызов метода типа Open(FileName = "aaa.doc", FileType = ...) да еще и с нетипированными параметрами?
В результате такое удобство на VB (VBA) превратилось в кошмар для программистов на C++ :-)) Попробуйте "ручками" составить запрос на чистом С++ к методу IDispatch::Invoke. Хорошо, ATL есть.
Вот и получилось - раннее связывание, когда имеется возможность доступа к таблице методов, и позднее, когда этого нет
А вот если сам написал маршалинг - все будет гораздо быстрее, исключая случай RPC


 
vuk   (2002-09-20 16:44) [50]

>Разница-то какая с т.з. эффективности?
Как сказать. Вы уверены, что при вызове через Invoke не происходит следующее:
1. параметры упаковываются клиентом в формат Invoke
2. Делается вызов Invoke
3. Все это упаковывается в формат RPC
4. Делается вызов RPC
далее на стороне сервера:
5. Распаковывается из формата RPC
6. Параметры преобразуются в формат COM
7. Делается вызов соответствующего IDispatch.Invoke
8. Там параметры разбираются и вызывается соответствующий метод.

У меня почему-то подозрение, что все именно так и происходит. Если это так, то разница будет в количестве требуемых преобразований данных при вызове.


 
Romkin   (2002-09-20 16:48) [51]

Именно так... Только звено с rpc необязательно, я, например, часто работаю через Borland Socket Server, кстати, если кому интересно, SConnect.pas - там очень хорошо виден маршалинг :-))


 
vuk   (2002-09-20 16:51) [52]

to Romkin:

>а VB понятия не имеет о структуре VTBL
Текущие версии VB, насколько мне известно, при наличии tlb используют VTable вызовы.

>Попробуйте "ручками" составить запрос на чистом С++ к методу
>IDispatch::Invoke.
А на кой? Можно ведь той же tlb пользоваться.


 
vuk   (2002-09-20 17:12) [53]

>>Попробуйте "ручками" составить запрос на чистом С++ к методу
>>IDispatch::Invoke.
>А на кой? Можно ведь той же tlb пользоваться.
Извиняюсь, не так Вас понял. Можно это пропустить...


 
Romkin   (2002-09-20 17:12) [54]

Я имел в виду старые версии Васика, там этого не было
При чем здесь tlb? исполнимого кода-то в ней нет. Все дело в том, что Delphi усиленно скрывает детали работы интерфейсов, а на C++ они видны полностью (при желании), если не использовать макросы ATL
А на Delphi - comobj.DispatchInvoke


 
Digitman   (2002-09-20 17:13) [55]

>Romkin

100%-но согласен ! Именно SConnect дает наглядное представление о маршаллинге ! И спасибо-таки за это Борланду)... механизмы Proxy и Stub - там как на ладони)



 
vuk   (2002-09-20 17:25) [56]

>При чем здесь tlb? исполнимого кода-то в ней нет.
Я ж говорю - можно пропустить. Я думал Вы о реализации Invoke...
Там можно очень удобно использовать tlb...


 
Romkin   (2002-09-20 17:36) [57]

2Digitman не совсем о маршаллинге, при реализации собственной заглушки через IMarshal механизм совершенно другой, это дает представление об RPC (вызов СОМ-сервера на удаленном компьютере)
А реализация маршалинга Борланд - частный случай, его можно делать и совершенно по-другому, например, можно (на Delphi!) написать собственный маршалинг потомков IUnknown, построив коклассы-заглушки, и передачу вызовов сделать любым образом, как захочешь


 
Набережных С.   (2002-09-20 17:47) [58]

Господа, ИМХО это вопрос чисто терминологический. Я когда-то для себя принял так:
> раннее связывание - это когда у компилятора есть информация о методах интерфейса
> позднее - соответственно наоборот
> особый случай - диспинтерфейсы
И меня такое деление вполне устраивает:)
А при чтении или разговоре из контекста всегда можно понять, о чем идет речь.


 
vuk   (2002-09-20 17:50) [59]

to Набережных С.
Поддерживаю! :o)


 
Digitman   (2002-09-20 17:58) [60]

Соглоасен. Давайте на этом и остановимся пока, господа !


 
Aleksey Pavlov   (2002-09-23 13:25) [61]

Всем большое спасибо за содержательный диспут.
Вопрос об использовании той или иной терминологии прояснился окончательно :)




Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.007 c
14-8164
Long
2002-09-09 19:47
2002.10.03
Люди! Помогите, монитор весь покрылся радужными пятнами


6-8079
aglar
2002-07-31 10:49
2002.10.03
Размер скаченной с интернет информации


1-8006
Metotrone
2002-09-21 16:34
2002.10.03
Закрытие программы


14-8178
Con
2002-09-07 08:18
2002.10.03
TQuery


1-7962
Irisha
2002-09-23 22:36
2002.10.03
Можно ли в TDrawGrid вставить комбобокс





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский