Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по DCOM  (Прочитано 10933 раз)
0 Пользователей и 1 Гость смотрят эту тему.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« : 05-04-2006 16:11 » 

1. имеем сервер. реализован сервисом, в сервис засунут Remote data module, в RDM реализован интерфейс для некоей процедуры, GetData. соответственно, есть тлб-шка на всю эту лепоту.

2. имеем клиента. есть DCOMConnection, который благополучно видит запущенный сервис и может к нему подконнктиться. есть также импортированная и инсталлированная библиотека типов, из которой благополучно видна серверная процедура GetData.

проблема.

при вызове процедуры возвращается некое значение OleVariant, которое, по идее, содержит строку. (на сервере туда тупо кладётся Hello, World). при попытке присвоить это значение любой переменной или просто тупо вывести на экран, валится экспешн.

вопрос.

где грабли?
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 05-04-2006 19:12 » 

упростим Улыбаюсь

как создать COM-объект, к которому можно будет коннектиться с другой машины?
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 06-04-2006 01:49 » 

Cкоро придется реализовывать тоже самое. Будем вместе разбираться. Ага
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 06-04-2006 15:56 » 

разобрался

в двух словах.

1. создаём обычный проект.
2. в него добавляем Automation Object.
3. в Object запихиваем нужные свойства и пр.
4. компилим.
5. копируем экзешник на другую машину.
6. запускаем на другой машине с ключем /regserver
7. запускаем DCOMCNFG из командной строки, в ней находим свой компонент во вкладке DCOM Config, ставим Autentification Lelel = none, во все Permissions добавляем юзверя EVERYONE, которому назначаем все права.
8. делаем новый проект, в котором включаем в uses полученный XXX_TLB.PAS.
9. делаем CoXXXX.CreateRemote ('another_comp').

по идее, будет счастье. т.е. в созданном экземпляре класса, интерфейс которого вернёт CoXXXX.CreateRemote, будут доступны свойства и методы объекта, находящегося уже на другой машине. клёвая штука!

основные грабли - при апдейтах надо убеждаться что сервак на удалённой тачке был сначала /unregserver, а потом /regserver заново.
« Последнее редактирование: 20-12-2007 14:56 от Алексей1153++ » Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 06-04-2006 15:59 » 

з.ы. а вот авторов мудодейных статей, типа "СОМ - по существу!" с мегабайтовыми описаниями классов, интерфейсов и философских раздумий о преимуществах IDispatch над IDL - надо топить в децтве. двое суток угробил на полную чушь.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 06-04-2006 16:09 » 

Ты это не на АПИ реализовывал? А то мне на АПИ придется (т.е. никаких компонентов ). Я в этом сейчас полный ноль, но скоро придется плотнее заняться COM, а потом и DCOM. На форуме есть люди, которые владеют данным вопросом?
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 06-04-2006 16:29 » 

nikedeforest, а как понять "не на апи"? Улыбаюсь никакого кидания компонентов на форму я не делал, в том, что касается СОМ-а дельфя просто генерит код (объявления интерфейсов, вызовы тех или иных процедур, и т.д.). т.е. ты на выходе получаешь набор юнитов, а не набор компонентов. и чтобы скомпилировать их на другой машине, к примеру, тебе ничего в дельфи доустанавливать не придётся.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 06-04-2006 16:45 » 

Я в том смысле, получится ли мне применить твои знания на Visual C++, если проблемы возникнут.
Записан

ещё один вопрос ...
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 06-04-2006 17:06 » 

Хмм... вижу. А чем DCOM от СОМ отличается?

Цитата: x77
основные грабли - при апдейтах надо убеждаться что сервак на удалённой тачке был сначала /unregserver, а потом /regserver заново.
Ну-у, это не грабли. Это правда жизни...

nikedeforest, гавно вопрос - применить знания можно, но может не получитьсяввиду специфики мастеров.
Записан

Ёжики, это не только ценные шкурки...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 06-04-2006 17:56 » 

Если   теория и методы одинаковы, то перенимание знаний не должно вызвать проблем Ага
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 11-04-2006 08:16 » 

DCOM отрабатывает нормально, но после этого остаётся висеть процесс Улыбаюсь при повторном запуске - второй процес.... и т.д.

всё работает, но процессы плодятся Жаль пробовал менять ThreadingModel и кол-во инстансов при регистрации фабрики класса - нужного эффекта не добился.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #11 : 11-04-2006 17:23 » 

на другой машине при такой же конфигурации всё работает нормально. шаманство Жаль
Записан

Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 20-01-2007 17:26 » 

Народ, еще разбираетесь?
Возникла следующая проблема:
Есть сервер DCOM. Настроен на машине, локально работает.
Клиент с другой машины не может с ним работать.
DCOMCNFG настраивал.
Причем фишка получается следующего характера. Запуск вроде как происходит, т.к. выскакивает главная форма сервера. А вот дальше клиент говорит, что у него нет доступа.
Читал Елманову. Там вообще говорится, что на компе-сервере должны быть учетные записи пользователей.

А идея вообще-то в следующем. Сделать общий сервер для авторизации и доступа к справочникам. Пока нифига не получается.
Записан

Ёжики, это не только ценные шкурки...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #13 : 22-01-2007 11:55 » 

если честно, я в итоге отказался от DCOM и сделал на Indy нормальный MessageServer. и наступило щастье.

а что касается DCOM, то там действительно должны быть заведены соответствующие учётные записи. т.е. на всех клиентах должен быть настроен тот юзер, под которым осуществляется коннект. есть три варианта, которым соответствуют три варианта настройки в DCOMCNFG на вкладке User Identity:

Interactive: dcom сервер будет пытаться запуститься под той учётной записью, под которой залогинена система
Launching user: запись, под которой был запущен процесс, обратившийся к dcom-серверу
This user (или как-то так): руками вводится логин/пассворд, под которым будет запускаться dcom-сервер.

часто имеет смысл для прочих вкладох везде добавить пользователя everybody (или everyone - тоже уже не помню Улыбаюсь )

что касается твоего случая. поскольку сервак запускается, то DCOMCNFG, скорее всего, настроен правильно. надо смотреть, что именно делает сервак (пишет на диск, обращается к MSSQL-серверу и т.д.) и проверять, есть ли у той учётной записи, под которой он был запущен - право на эти действия. под какой учётной записью он запускается, можно увидеть в списке процессов - там на несколько секунд появится твой dcom-сервер при активации, и там будет написано, "кто" его запустил. после этого просто проверь права этого "кто" на предмет действий, осуществляемых серваком.
« Последнее редактирование: 22-01-2007 11:58 от x77 » Записан

DemonicAlligator
Гость
« Ответ #14 : 22-01-2007 15:06 » 

Антач, а ты опосля окончания работы с COM-сервером присваивал nil его переменной, или unassigned, если она Variant? ежели этого не делать - то хоть обдолбись, но экземпляр сервиса нифига не освободица... я на эти грабли наступал, когда Ёксель пытался использовать (в итоге забил и воспользовался FlexCel Улыбаюсь )
А щас занимаюсь нетрадиционным сексом с SNMP Улыбаюсь
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #15 : 22-01-2007 15:30 » 

Синий Аллигатор, да, я потом до этого допёр Улыбаюсь но всё равно пришлось отказаться от затеи с DCOM. потому что заводить на всех клиентских машинах нового пользователя для тривиального мониторинга (в моём случае) - это безумие. а на сокетах всё нормально живёт по сей день.
Записан

Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 27-01-2007 04:49 » 

Разобрался.
Действительно дело было в настройках DCOMCNFG.
Просто нужно было вдумчиво прочитать за что отвечают настройки, а я ориентировался на логику.
Другой вопрос, как серверу знать, кто подключен?
Записан

Ёжики, это не только ценные шкурки...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines