The Nameless One
|
|
« Ответ #30 : 09-02-2010 07:24 » |
|
RXL, спасибо что развеяли моё заблуждение касательно этого вопроса
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #31 : 09-02-2010 09:54 » |
|
Не... RXL не прав... Использование COM - очень удобно разработчикам и пользователям... Пользователь библиотеки не заботиться не об ее названии, ни об системе, в которой она установлена... Разработчики уверены - кто использовал однажды продолжит использовать, старые коды работают... И именно DirectX в этом плане яркий представитель успешной библиотеки....
|
|
|
Записан
|
while (8==8)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #32 : 09-02-2010 10:13 » |
|
sss, чем я не прав? Прошу цитировать, а то не понятно, о чем речь.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #33 : 09-02-2010 22:22 » |
|
Согласен с RLX, какое отношение успешность (тут еще можно указать много эпитетов, в том числе и скорость работы, удобство использования, и т.д.) библиотеки имеет к COM, как к технологии? Это могла быть и просто обычная dll...
|
|
|
Записан
|
С уважением Lapulya
|
|
|
sss
Специалист
Offline
|
|
« Ответ #34 : 10-02-2010 01:13 » |
|
Извиняюсь... The Nameless One, COM не имеет никакого отношения к совместимости версий DX.
Вот пример. Я один раз написал программу, использующую COM интерфейсы AutoCAD 2002 в Win98. Она прекрасно работает и в AutoCAD 2010 в Windows7. P.S.: Вообще не хотел ввязываться в разговор, но опять не удержался.
|
|
« Последнее редактирование: 10-02-2010 01:21 от sss »
|
Записан
|
while (8==8)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #35 : 10-02-2010 05:01 » |
|
sss, понятно. Под версиями я не имел в виду разные версии ОС, а только версии интерфейсов.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #36 : 10-02-2010 10:01 » |
|
sss, все же я не понимаю причем тут COM? Да, DX достаточно качественный продукт, работает под разные поколения ОС и поддерживает старые версии и что? Это всего навсего качественная библиотека, которая могла, как опираться на технологию COM, так и нет... вот есть user32.dll, она обладает теми же достоинствами и не является COM сервером.
|
|
« Последнее редактирование: 10-02-2010 10:14 от lapulya »
|
Записан
|
С уважением Lapulya
|
|
|
sss
Специалист
Offline
|
|
« Ответ #37 : 11-02-2010 03:48 » |
|
lapulya, то же самое можно сказать: - зачем мне C++? Я всё могу сразу замутить в HexView. Код написанный в C++ это всего навсего набор машинных команд.
|
|
|
Записан
|
while (8==8)
|
|
|
WDMclient
Гость
|
|
« Ответ #38 : 11-02-2010 04:22 » |
|
Я тут пока не выхожу из КОМы.
COM - это и способ представления данных , но больше это способ обмена данными между приложениями , по довольно примитивной и однородной схеме , пускай не всегда быстрой , но за счет этого надежной.
COM - гибок , не навязывает особо программисту , поэтому каждый может изобретать свой путь.
Если оставаться в рамках основных требований стандарта , то приложение будет способно к быстрому апгрейдингу и использованию сторонними программистами и программами.
И эффект интересный возникает с представлением приложения , как например IExplorer. Майкрософт на суде заявила что такой программы у нее нет , а есть лишь набор встроенных компонентов, и именно их комбинация дает иллюзию существования такого броузера.
|
|
« Последнее редактирование: 11-02-2010 05:19 от WDMclient »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #39 : 11-02-2010 05:47 » |
|
sss, не согласен, COM как и dll это механизмы призванные для того чтобы 100 раз не писать один и тот же код в разных приложениях (так называемое повторное использование). Да, у ком есть еще и то достоинство, что он в нем реализован RPC, но если все умещается на одной машине это роли не играет. Учитывая сказанное выше сравнивать COM и dll абсолютно корректно. Если же речь идет о работе с компонентами на удаленной машине, тут другое дело, но раз речь шла о DX, то в 99,9% случаев будет использована только локальная машина, а тут у COM преимуществ имхо нет (если есть, прошу их перечислить). зачем мне C++? Я всё могу сразу замутить в HexView. Код написанный в C++ это всего навсего набор машинных команд. не принимается, на с++ в отличии от HexView удобно писать, проектировать и т.д. и т.д., а COM и dll в этом плане одинаковы, точнее даже преимущество полностью на стороне dll (ну понятное дело если программа написана целиком на с++ или ему подобном языке, а не предположим на VB, где с dll как раз сильно неудобно, но иногда можно, вот тут как раз сравнение с++ и HexView вполне корректно). Преимущества, если надо, хотя они и очевидны, я могу расписать...
|
|
« Последнее редактирование: 11-02-2010 05:51 от lapulya »
|
Записан
|
С уважением Lapulya
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #40 : 11-02-2010 05:58 » |
|
WDMclient, COM очень много всего навязывает, внешний интерфейс dll (импорт экспорт определенных функций) + формат внешних интерфейсов объектов (QueryInterface и т.д.) + формат внешних данных (иногда, если предполагается работать с VB и т.д., это я о VARIANT). Если с VB и им подобными работать не предполагается (и не будет использоваться RPC), то имхо COM сервер ничем от DLL не отличается, но есть ряд ограничений обусловленный предначертанными интерфейсами.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
WDMclient
Гость
|
|
« Ответ #41 : 11-02-2010 07:47 » |
|
Сила С++ проявляется только если используешь интерактивную оболочку Visual Studio или Борланд "студио" , скорость разработки повышается от того что поставил стрелочку от указателя или точку и тебе выпал список переменных , и функций. Вот и все преимущество и не надо убеждать что типа магия в классах и других фичах.
А ты попробуй тоже самое без этих подсказок , постоянно глядеть как правильно метод или переменная пишется.
Ну и конечно - так как основная масса программеров пишет комменты паршиво , то наличие класса более менее дает представление , хотя бы о функциях использованых в программе. Попробуй десятитысяче-строчную программу разбери не написанную тобою.
Вот таким же образом работает и COM. Делаешь #import .tlb и по быструхе с со смарт-указателем работаешь.
да и сам TLB это уже некоторая часть документации. Которую мало кто написал бы для DLL, ее автоматически делает MIDL , да и вообще говорить о функциях программы хорошо в контексте определенных "больших задач" то бишь интерфейсов. В контексте чего функции будут в DLL?
На коме не делаются скоростные программы , тут другие задачи. которые должны отрабатывать тупо и надежно. - web-money -КОШЕЛЕК ,(требуют постоянных изменений)(безопасность понимашьли) - активы-иксов (это знают все)
- компилятор-Лисп (а я емаЁ взял да и просоеденил его к тому редактору который хотел)
Программирование COMов - это игра в конструктор , где можно быстро заменять детали.
|
|
« Последнее редактирование: 11-02-2010 12:50 от WDMclient »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #42 : 11-02-2010 19:02 » |
|
lol
|
|
|
Записан
|
С уважением Lapulya
|
|
|
sss
Специалист
Offline
|
|
« Ответ #43 : 12-02-2010 01:50 » |
|
lapulya, сравнивать общий принцип использования библиотек dll с технологией COM, которая тоже использует dll, это бред. Поэтому я ввел сравнение с машинными кодами... А вот то что написал WDMclient - сказано довольно точно и в общем я поддерживаю.
|
|
|
Записан
|
while (8==8)
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #44 : 12-02-2010 07:08 » |
|
sss, сравнивая COM с dll я имел ввиду, что COM избыточен для тех случаев что я описал (все пишем на с++ и на одной машине), фактически он лишь мешает (причем по всем параметрам), а не помогает, какая от него польза, ну перечисли хоть что-то? Я не вижу ни одного плюса, а то, что есть хорошие библиотеки написанные как COM сервера аргументом не считается, по упомянутым выше причинам (там где про DX написано) не могу считать серьезным последний пост WDMclient, с чем ты там согласен конкретно, кроме последней фразы? Программирование COMов - это игра в конструктор , где можно быстро заменять детали И опять же, это к COM, как к технологии не относится (точнее относится, но не потому что это COM, а потому что его логически законченная часть функционала с проработанными внешними интерфейсами пригодная к повторному использованию, что ложится в простую dll при указанных мной ограничениях)? Поймите меня правильно, я не хочу тут сказать, что COM это говно куда ни копни, я лишь хочу сказать, что при указанных мной ограничениях COM лучше НЕ использовать, ибо нет от него плюсов, просто делаем обычную dll. Если же надо перекинуть например модуль на удаленный хост или воспользоваться модулем из VB, нет проблем, пишем COM враппер (т.е. COM сервер, который не содержит логики и просто транслирует вызовы этой dll и распространяется с ней) ил,и если это ясно изначально (это я про Vb или удаленный хост), вот тогда можно писать COM сразу (хотя имхо я бы и так не делал, а сначала бы опять сделал просто dll).
|
|
« Последнее редактирование: 12-02-2010 07:32 от lapulya »
|
Записан
|
С уважением Lapulya
|
|
|
WDMclient
Гость
|
|
« Ответ #45 : 12-02-2010 07:49 » |
|
1.У меня ни дня не проходит что бы какой нить ActiveX не загружался с интернета. (по непонятным причинам Java проиграл борьбу за клиент-интернет ) 2.COM - будет существовать потому как того хочет Майкрософт 3.Не вижу причин не работать с COM (Ведь под этим словом подразумевается куча всяких интересных механизмов, доведенных по своей структуре до весьма искусного(чуть ли не научного) порядка) конечно можно сделать тоже самое и своими руками , но получилось бы только жалкое подобие , размазаный комок грязи представлял этот код( потому как время для этого надо и несколько голов) Те спецы что отрабатываели и тестировали COM , не зря время теряли , и теперь имеем еще одну технологию , чем больше технологий , тем богаче мир программирования , тем больше шансов проявить себя тому у кого есть мозги и желание учиться.
4.У всех технологий есть плюсы и минусы. Но если ты изучил технологию тогда большой тебе плюс ,( и большая вероятность получить за это бабла)
5.Есть гипотеза что новые приемы в программировании появляются , когда разработчикам становиться СКУЧНО.
|
|
« Последнее редактирование: 12-02-2010 07:54 от WDMclient »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #46 : 12-02-2010 08:06 » |
|
А если отвлечься от COM и поговорить об опыте использования других технологий удаленного вызова? Как предложение.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
x77
Команда клуба
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #47 : 16-02-2010 17:11 » |
|
коллбэки в длл - рулят форева и в топку микрософт.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #48 : 16-02-2010 19:55 » |
|
Игор, уточни — callback на другой сервер?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
WDMclient
Гость
|
|
« Ответ #49 : 25-02-2010 19:07 » |
|
The Nameless One, и что из этого? Бутылки 0.5 и 0.7 тоже обратно совместимы, но не используют COM. Поддержка старых интерфейсов целиком на совести DX. Я как(мультифридный клиент) заметил что не все бутылки 0.5 и 0.7 можно сдать обратно (кэлбэк не проходит) Совместимость с приемным пунктом(а часто это бывает синглтонный сервер) не всегда поддерживается последним. Бывает после длительного маршалинга приходится во свояси чесать интерфейс в раздумье над своим IConnectionPoint(ом) в общем вместо ожидаемого поъема счетчика настроения приходится вызывать очередной Релиз , не редко с критическим вылетом на неделю из процесса вменяемого функционирования со сменой аппартаМЕНТОВ.
|
|
« Последнее редактирование: 25-02-2010 19:34 от WDMclient »
|
Записан
|
|
|
|
x77
Команда клуба
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #50 : 07-03-2010 14:16 » |
|
Игор, уточни — callback на другой сервер?
зачем на другой? на свой. есть два варианта, да? 1. клиент живёт локально, а на удалённом хосте работает сервис, обрабатывающий удалённые запросы и дёргающий нужные длл. так будет работать SOAP, например, если мы напишем на нём классический веб-сервис. и так же работает КОМ, соап - это просто надстройка над комом, позволяющая передать по http ком-объект. и вообще любой объект. 2. клиент живёт локально, и длл живёт локально, и клиент её дёргает, а она уже сама знает, куда ей ломится и что там делать. так работает всё остальное и для этого вообще изначально были придуманы длл - вынести повторяющуюся либо часто меняющуюся часть кода отдельно. парадокс всех этих новых технологий в том, что время, требующееся для их уверенного использования НА ПОРЯДКИ превышает время, которое уйдёт у среднего программера на написание тупого TCP/IP сервера со своим клиентом. который будет делать всё то же самое, но при этом будет быстрее, на порядки проще в отладке, не требовать ахиренной квалификации для дальнейшего сопровождения и доработки, и т.д. чем больше фантазёров лезет во всю эту муру, тем больше оказывается проектов, написанных на всей этой муре, а после того, как их поувольняют, наконец, ко всем бигудям - компания вынуждена требовать у соискателей знания этой муры. смысла кома только в одном - в интерфейсе Inknown. т.е. мы можем работать с объектом, не зная, что именно умеет делать этот объект. любой нормальный прогер сто раз это делал в любом своём плагине, и безо всяких комов.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #51 : 06-04-2010 14:38 » |
|
А никому, случайно, не приходилось работать с COM из PHP? Имею траблу типа "type mismatch" с полным не пониманием, что тут не совпадает... Если сторонняя библиотека, написанная на VB. Описание метода VB: Public Function Logon( _ ByVal LogonID As String, _ ByVal Password As String, _ ByRef DataSourceName As String, _ ByRef Result As String, _ ByRef Severity As Integer _ ) As Boolean
$ctx = new COM('some_com_class'); $user = 'login'; $pswd = 'password'; $dsn = 'some_dsn'; $result = ''; $severity = 0; $retcode = $ctx->Logon($user, $pswd, $dsn, $result, $severity);
Объект создается без вопросов. Перехватываю исключения: COM exception: exception 'com_exception' with message 'Parameter 0: Несовпадение типов.' ...
Голову уже сломал. Пробовал всякие извраты с "new VARIANT(....)". Два часа рою инет и никакого намека. PHP 5.2.12 Win32.
|
|
« Последнее редактирование: 07-04-2010 05:06 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #52 : 06-04-2010 15:01 » |
|
попробуй ByRef Severity As Integer
ByRef Severity As String а потом преобразовать в integer средствами VB
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #53 : 06-04-2010 15:34 » |
|
А там что, параметры с конца исчисляются?
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #54 : 07-04-2010 01:37 » |
|
RXL, как инициализируешь ByVal As String ? В смысле чему равен vt и bstrVal ? VARIANT v1;
v1.vt = VT_BSTR; v1.bstrVal = SysAllocString( "some text"); SomeMethod( v1); SysFreeString( v1.bstrVal);
В PHP аналогично можно сделать? Пропуская строку через SysAllocString, ты ее готовишь к маршаллингу... P.S.: SysAllocString можно заменить на CoTaskMemAlloc... P.P.S: CoTaskMemAlloc можно достать и через COM объект интерфейа IMalloc...
|
|
« Последнее редактирование: 07-04-2010 01:41 от sss »
|
Записан
|
while (8==8)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #55 : 07-04-2010 05:17 » |
|
Sla, библиотека сторонняя - менять ничего не могу. resource, сам удивляюсь... sss, я просто передаю переменную. В PHP можно создать Variant. Я пробовал так: $ctx = new COM('some_com_class'); $user = new VARIANT('login'); $pswd = new VARIANT('password'); $dsn = new VARIANT('some_dsn'); $result = new VARIANT(''); $severity = new VARIANT(0); $retcode = $ctx->Logon($user, $pswd, $dsn, $result, $severity);
Ошибка меняется: COM exception: exception 'com_exception' with message 'Parameter 2: Несовпадение типов'. Потом так: $ctx = new COM('some_com_class'); $user = new VARIANT('login', VT_BSTR); $pswd = new VARIANT('password', VT_BSTR); $dsn = new VARIANT('some_dsn', VT_BSTR); $result = new VARIANT('', VT_BSTR); $severity = new VARIANT(0, VT_I2); $retcode = $ctx->Logon($user, $pswd, $dsn, $result, $severity);
Ошибка та же - на второй параметр. Последовательно меняю: $ctx = new COM('some_com_class'); $user = new VARIANT('login', VT_BSTR); $pswd = new VARIANT('password', VT_BSTR); $dsn = 'some_dsn'; $result = new VARIANT('', VT_BSTR); $severity = new VARIANT(0, VT_I2); $retcode = $ctx->Logon($user, $pswd, $dsn, $result, $severity);
COM exception: exception 'com_exception' with message 'Parameter 1: Несовпадение типов'. $ctx = new COM('some_com_class'); $user = new VARIANT('login', VT_BSTR); $pswd = new VARIANT('password', VT_BSTR); $dsn = 'some_dsn'; $result = ''; $severity = new VARIANT(0, VT_I2); $retcode = $ctx->Logon($user, $pswd, $dsn, $result, $severity);
COM exception: exception 'com_exception' with message 'Parameter 0: Несовпадение типов'. Похоже, что дело в $severity. Только не понимаю, в чем...
|
|
« Последнее редактирование: 07-04-2010 05:29 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #56 : 07-04-2010 05:53 » |
|
Вот как надо в C++ short i; VARIANT var; var.vt = VT_BYREF | VT_I2; var.piVal = &i; SomeMethod( var);
В PHP не знаю!
|
|
|
Записан
|
while (8==8)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #57 : 07-04-2010 07:18 » |
|
$severity = new VARIANT(0, VT_I2 | VT_BYREF); COM exception: exception 'com_exception' with message 'Variant type conversion failed: Несовпадение типов.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #58 : 07-04-2010 07:31 » |
|
RXL, VT_I4 ? И, может быть, первый аргумент в VARIANT( 0, xxx) не 0 а адрес на переменную?
|
|
« Последнее редактирование: 07-04-2010 07:33 от sss »
|
Записан
|
while (8==8)
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #59 : 07-04-2010 07:55 » |
|
а аналогичный по смыслу с++ код работает? Т.е. вопрос в следующем - сам ком сервер работает?
|
|
|
Записан
|
С уважением Lapulya
|
|
|
|