Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Multi-tier + DCOM


Страницы:   1 2 3

DeadMeat ©   (2008-10-01 09:54:00) 

Здравсте.
Вообщем проблема вот в чем. Пытаюсь освоить трех звенку. Почитал хелп.. Почитал инет.
Вроде понял куда и чего надо делать, чтобы оно заработало.
Решил делать через DCOM.
На локальной машине все работает (когда и сервер и клиент на ней). Причем не важно, есть ли Делфи на этой машине или нет. Т.е. с midas.dll вроде разобрались.
А вот когда сервер на одной машине (Win2k3), а клиент на другой, уже проблема. Клиент не видит "сервер". Т.е. указываю имя компьютера, а то, что на нем крутится сервер, клиент не видит.
Вроде проблема в правах. Пытался поковырять dcomcnfg. Выставил все права на Everyone (остальные удалил) на полный контроль (где нашел). Не помогло.
Запускал даже на контроллере домена (без настройки прав, т.е. по дефолту). При этом клиентская машина была включено в него и пользователь был членом Domain Admins.
Регистрировал сервер через /regserver.
В списке зарегистрированных он появляется. Но клиент все равно не видит его.
Что надо еще прописать или настроить, чтобы они друг-друга увидели?


Сергей М.   (2008-10-03 13:17:00) [21]

Да и справка об этом говорит недвусмысленно:

The general steps for creating a multi-tiered database application are

1 Create the application server.
2 Register or install the application server.
3 Create a client application.

The order of creation is important. You should create and run the application server before you create a client. At design time, you can then connect to the application server to test your client. You can, of course, create a client without specifying the application server at design time, and only supply the server name at runtime. However, doing so prevents you from seeing if your application works as expected when you code at design time, and you will not be able to choose servers and providers using the Object Inspector.

Note

If you are not creating the client application on the same system as the server, and you are using a DCOM connection, you may want to register the application server on the client system. This makes the connection component aware of the application server at design time so that you can choose server names and provider names from a drop-down list in the Object Inspector. (If you are using a Web connection, SOAP connection, or socket connection, the connection component fetches the names of registered providers from the server machine.)

Как раз твой случай)


Сергей М.   (2008-10-03 12:51:00) [22]


> чтобы это дело заработало, надо регить сервера на клиенте


Так тебе об этом давным-давно вроде бы уже сказано, см. [1])

Фабрика классасервера д.б. зарегистрирована на обеих сторонах будущего взаимодействия.

Регистрация библ-ки типов, как собссно и ее физическое присутствие, в принципе необязательны, в дан.случае по кр.мере на клиентской стороне


DeadMeat   (2008-10-03 12:37:00) [23]


> Сергей М. ©   (03.10.08 12:17) [22]

Запустил. Не появилось ничего нового.
Попробовал зарегить сервер у себя (на клиенте) - GUID появился.
На всякий случай приведу ветки для обоих случаев сразу (когда регистрировал только tlb файл и когда регистрировал только сервер).
tlb:
[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}]
@="IGHostDataServer"

[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}\ProxyStubClsid]
@="{00020424-0000-0000-C000-000000000046}"

[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"

[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}\TypeLib]
@="{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}"
"Version"="1.0"


--

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}]

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0]
@="Server Library"

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\0]

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\0\win32]
@="D:\\Projects\\temp(multi-tier)\\server\\server.tlb"

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\FLAGS]
@="0"

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\HELPDIR]
@=""


==============

Server:
[HKEY_CLASSES_ROOT\CLSID\{9BA5689E-17EE-4661-A999-A9F0212076AE}]
@="GHostDataServer Object"
"AppID"="{9BA5689E-17EE-4661-A999-A9F0212076AE}"
"Sockets"="1"
"Web"="1"

[HKEY_CLASSES_ROOT\CLSID\{9BA5689E-17EE-4661-A999-A9F0212076AE}\Implemented Categories]

[HKEY_CLASSES_ROOT\CLSID\{9BA5689E-17EE-4661-A999-A9F0212076AE}\Implemented Categories\{13E85B3C-9508-11D2-AB63-00C04FA35CFA}]

[HKEY_CLASSES_ROOT\CLSID\{9BA5689E-17EE-4661-A999-A9F0212076AE}\LocalServer32]
@="D:\\Projects\\temp(multi-tier)\\server\\Server.exe"

[HKEY_CLASSES_ROOT\CLSID\{9BA5689E-17EE-4661-A999-A9F0212076AE}\ProgID]
@="Server.GHostDataServer"

[HKEY_CLASSES_ROOT\CLSID\{9BA5689E-17EE-4661-A999-A9F0212076AE}\TypeLib]
@="{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}"

[HKEY_CLASSES_ROOT\CLSID\{9BA5689E-17EE-4661-A999-A9F0212076AE}\Version]
@="1.0"


---

[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}]
@="IGHostDataServer"

[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}\ProxyStubClsid]
@="{00020424-0000-0000-C000-000000000046}"

[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"

[HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}\TypeLib]
@="{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}"
"Version"="1.0"


---

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}]

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0]
@="Server Library"

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\0]

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\0\win32]
@="D:\\Projects\\temp(multi-tier)\\server\\Server.exe"

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\FLAGS]
@="0"

[HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}\1.0\HELPDIR]
@="D:\\Projects\\temp(multi-tier)\\server\\"


Получается, что для того, чтобы это дело заработало, надо регить сервера на клиенте (либо руками добавлять нужные записи) и править реестр.
Делаю вывод, что либо я чтото не вызываю (при запуске клиента), либо чтото не так регистрирую (на клиенте), либо дурак.


Сергей М.   (2008-10-03 12:17:00) [24]


> GUID (который в реестре я не нашел) - CLASS_GHostDataServer:
>  TGUID = '{9BA5689E-17EE-4661-A999-A9F0212076AE}'


Ну вот тебе и объяснение наблюдаемого тобой "чуда".

Запусти свое серверное приложение как обычное приложение - при первом же запуске произойдет регистрация фабрики класса твоего MIDAS-сервера.

После этого лезешь в реестр , находишь вновь(по отношению к [21]) появившиеся ключи, касающиеся CLASS_GHostDataServer, и приводишь их пути и полное содержимое сюда.

p.s.
Результаты приводи в формате *.reg-формате - так легче читать и воспринимать творящееся в реестре


DeadMeat   (2008-10-03 11:24:00) [25]

Открыл в IDE файл Server.tlb (он у меня так называется). Там дерево.
Взял GUID от Server (это корень):
{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}
Поиск в реестре дал следующее:
HKEY_CLASSES_ROOT\Interface\{B8E00EC9-E931-4B4E-85E9-72D606B246AF}(это GUID от IGHostDataServer - это я так назвал мой RemoDataModule)
В этом разделе три подраздела:
ProxyStubClsid
ProxyStubClsid32
TypeLib
Последний и содержит в себе тот GUID
Следующий ключ в реестре:
HKEY_CLASSES_ROOT\TypeLib\{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}
У него один подраздел:
1.0
В нем еще свои три:
0
FLAGS
HELPDIR
В подразделе 0 есть один подраздел:
win32
В нем прописано значение REG_SZ, содержащее путь к моему tlb файлу.
Есть еще два, но они дублируют содержимое первых двух и находятся в
HKEY_LOCAL_MACHINE
В самом Server_TLB.pas:
Первый - это LIBID_Server: TGUID = '{4E9765DD-9B3F-4BCB-A625-8C47CE0E67B5}';. Это который в корне дерева.
Второй - IID_IGHostDataServer: TGUID = '{B8E00EC9-E931-4B4E-85E9-72D606B246AF}'.
Третий GUID (который в реестре я не нашел) - CLASS_GHostDataServer: TGUID = '{9BA5689E-17EE-4661-A999-A9F0212076AE}'
Вот собсна и все.


Сергей М.   (2008-10-03 10:49:00) [26]


> я нашел что он там есть


При штатной регистрации в реестре должны фигурировать как минимум 3 ключа, где фигурирует CLSID твоего сервера.

Приведи сюда полные пути и содержимое этих ключей ..


Сергей М.   (2008-10-03 10:32:00) [27]

То что список ServerName у тебя пустой (в дизайн-тайм или в ран-тайм - не важно) говорит только об одном - фабрика класса твоего MIDAS-сервера не зарегистрирована (или зарегистрирована некорректно) на том компьютере, на котором вызывается метод TDispatchConnection.GetServerList, т.е. на компьютере, где работает контроллер твоего MIDAS-сервера.


Сергей М.   (2008-10-03 10:15:00) [28]


> почему то мой дебагер в этот юнит не заходит


Потому что в опциях отладки в св-вах проекта должна быть установлена опция "Use Debug DCU's".

Use Debug DCUs
The Debug DCUs contain debug information and are built with stack frames. When this option is checked, the compliler prepends the Debug DCU path (specified in Tools|Debugger Options on the General page) to the unit Search path specified in Project|Options on the Directories/Conditionals page.


DeadMeat   (2008-10-03 10:05:00) [29]


> Сергей М. ©   (02.10.08 09:36) [16]

Последовал вашему совету. Правда почему то мой дебагер в этот юнит не заходит, поэтому пришлось изучать "на глаз".
Если я правильно понял, то оно ищет (используя GetServerList) в реестре CLSID. Руками поискав в реестре (на предмет ГУИДа моего сервера) я нашел что он там есть. Появляется после регистрации tlb файла и "уходит" после анрегистрации (не знаю как правильно это по русски).
Вот собсна и все, что я понял..
Может в службе какой проблема? Может в правах? Хотя права я крутил как только мог.


Сергей М.   (2008-10-02 09:36:00) [30]


> DeadMeat   (02.10.08 09:22) [15]
>
>


Предлагаю самостоятельно разобраться в происходящем, внимательно изучив текст процедуры MConnect.GetMIDASAppServerList


DeadMeat   (2008-10-02 09:22:00) [31]


> Сергей М. ©   (02.10.08 09:14) [14]

Именно. А при тех же действиях, но на локальном компьютере (тоже в дизайн тайме) в нем появляется имя моего дата модуля. Т.е. чтото гдето не зарегистрировано это точно. Но я сделал все, как тут писали и это не помогло.


Сергей М.   (2008-10-02 09:14:00) [32]


> DeadMeat   (02.10.08 08:15) [13]


т.е. ты выбрал имя компьютера, а список ServerName пустой ?


DeadMeat   (2008-10-02 08:15:00) [33]


> clickmaker ©   (01.10.08 18:47) [12]

Опять не понял. Дык я же все делаю в дизайн тайме.


clickmaker   (2008-10-01 18:47:00) [34]

так ComputerName же тоже паблишед. Чего бы его не установить в дизайн тайме?


DeadMeat   (2008-10-01 18:41:00) [35]


> Сергей М. ©   (01.10.08 17:33) [9]


> Зачем серверу форма ? Кто на нее глазеть-то будет ?)

Ну как же!! А фишечки рюшечки? Я на нее еще скины повешу!! (шука конечно).
Это только сейчас у него форма. Пока я просто пытаюсь понять что и как.


> Ты бы потренировался что-ли на, скажем, Excel'е как на удаленном
> COM-сервере - при прочих равных условиях он хотя бы корректно
> регистрируется, так что при правильной настройке DCOM-конфигурации
> удаленный доступ к нему (см. CreateRemoteCOMObject) обычно
> не вызывает проблем.

Блин... Видимо придется начать оттуда, если ничего не выйдет так.


> clickmaker ©   (01.10.08 17:59) [10]


> ты читал про ServerName в справке? Что там про реестр написано?

Собсна написано там вот что:
For DCOM and OLEnterprise connections, the servers must be registered in the system Registry.
И все. А как эту регистрацию провести и куда в реестре писать - ни слова.


> Используй ComputerName в рантайме

Не совсем понял, что это дает. Мне бы в дизайн тайме в начале получить соединение, чтобы легче и наглядней было создать остальные ClientDataSet'ы и другие настройки просто выбирая параметры из списка.


clickmaker   (2008-10-01 17:59:00) [36]

> Собсна до этого не доходит, т.к. я в данный момент пытаюсь
> в дизайн тайме настроить ServerName и другие параметры

ты читал про ServerName в справке? Что там про реестр написано?
Используй ComputerName в рантайме


Сергей М.   (2008-10-01 17:33:00) [37]


> обычный ЕХЕ с обычной Формой.


Зачем серверу форма? Кто на нее глазеть-то будет ?)

Ты бы потренировался что-ли на, скажем, Excel'е как на удаленном COM-сервере - при прочих равных условиях он хотя бы корректно регистрируется, так что при правильной настройке DCOM-конфигурации удаленный доступ к нему (см. CreateRemoteCOMObject) обычно не вызывает проблем.


DeadMeat   (2008-10-01 17:24:00) [38]


> clickmaker ©   (01.10.08 17:15) [7]


> при вызове DCOMConnection1.Open лезут какие-либо исключения?

Собсна до этого не доходит, т.к. я в данный момент пытаюсь в дизайн тайме настроить ServerName и другие параметры.


> сервер и клиент в одном домене?

Да.


> на серваке есть доступ к этому COM-серверу у запускающего
> юзера на клиенте?

Везде, где нашел, поставил Everyone на полный доступ и еще добавил Domain Admins (коим являюсь я) и Domain Users.


> сервер - это обычный экзешник или сервис?

Просто обычный ЕХЕ с обычной Формой.


clickmaker   (2008-10-01 17:15:00) [39]

при вызове DCOMConnection1.Open лезут какие-либо исключения?
сервер и клиент в одном домене?
на серваке есть доступ к этому COM-серверу у запускающего юзера на клиенте? (Security - Access permissions - Customize)
сервер - это обычный экзешник или сервис?


DeadMeat   (2008-10-01 15:36:00) [40]

Блин. Или я туплю... Или что.
Вообщем рассказываю как делал ПО ШАГАМ.

Сервер:
Создал приложение.
Добавил в него TRemoteDataModule. Дал ему имя. Instancig - Multiple. Threading Model - Netrual.
На него бросил ADOConnection, ADODataSet, DataSetProvider1.
Настроил их друг на друга и вписал строку запроса.
Сохранил. Откомпилил. Перебросил на другой компьютер (он же контроллер домена) ЕХЕ файл и midas.dll.
midas.dll бросил в Windows\System32 и сделал regsvr32.exe midas.dll
Мне сказало, что ОК.
Далее запустил свой сервер с параметром /regserver.
Посмотрел в dcomcnfg - он там появился.

Клиент:
Создал приложение.
На форму бросил DCOMConnection1, ClientDataSet1, DataSource1, DBGrid1.
Настроил их друг на друга.
У DCOMConnection1 свойство ComputerName выставил в имя моего сервера (компьютера). Решил выбрать (в дизайн тайме) ServerName - пусто.

Теперь что начал делать по вашим советам.
Сделал clickmaker ©   (01.10.08 14:29) [5]на клиенте.
Не помогло.
Сделал еще и на сервере.
Не помогло.
tbl файл брал от моего сервера. После компиляции там в папке создался.

Что я упустил или сделал не так??


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо