Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.02 c
1-8061
Борис
2002-09-23 09:20
2002.10.03
Не работает SaveDialog1.Execute. Help


14-8154
NeyroSpace
2002-09-06 16:41
2002.10.03
Папа Римский и INTERNET !???


3-7841
Aristarh
2002-09-10 17:20
2002.10.03
2NickBat: CM-это не Championship Manager?


1-7905
3asys
2002-09-23 11:48
2002.10.03
---|Ветка была без названия|---


1-8056
Metotrone
2002-09-22 18:12
2002.10.03
POS