Конференция "Базы" » Multi-tier + DCOM
 
  • Сергей М. © (03.10.08 10:49) [20]

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


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

    Приведи сюда полные пути и содержимое этих ключей ..
  • DeadMeat (03.10.08 11:24) [21]
    Открыл в 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}'


    Вот собсна и все.
  • Сергей М. © (03.10.08 12:17) [22]

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


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

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

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

    p.s.
    Результаты приводи в формате *.reg-формате - так легче читать и воспринимать творящееся в реестре
  • DeadMeat (03.10.08 12:37) [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\\"



    Получается, что для того, чтобы это дело заработало, надо регить сервера на клиенте (либо руками добавлять нужные записи) и править реестр.
    Делаю вывод, что либо я чтото не вызываю (при запуске клиента), либо чтото не так регистрирую (на клиенте), либо дурак.
  • Сергей М. © (03.10.08 12:51) [24]

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


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

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

    Регистрация библ-ки типов, как собссно и ее физическое присутствие, в принципе необязательны, в дан.случае по кр.мере на клиентской стороне
  • Сергей М. © (03.10.08 13:17) [25]
    Да и справка об этом говорит недвусмысленно:

    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.)

    Как раз твой случай)
  • Сергей М. © (03.10.08 13:27) [26]
    Т.е. для рантайм-работы регистрация удаленного сервера в реестре на стороне локального клиента вообще не нужна - обращение к удаленной машине-серверу с целью создания там экз-ра COM-сервера происходит с использованием CLSID.

    Этот CLSID ты можешь указать явно ручками, а можешь получить его из реестра по имени, если такая инф-ция там имеется в результате автоматической (см. выше цитату из справки) или эквивалентной ей ручной регистрации.
  • DeadMeat (03.10.08 14:58) [27]

    > Сергей М. ©   (03.10.08 12:51) [24]
    </I
    > Так тебе об этом давным-давно вроде бы уже сказано, см.
    > [1])

    >
    Просто странно, регистрировать рабочий готовый (ну таким он когда-то будет) сервер на клиенте. А оказывается я просто не так понял саму суть работы.
    Я же в начале часик другой сидел просто и читал эту справку, прежде чем вообщем чтото делать.
    Но видимо не так понял эту часть.
    Надеюсь щас я правильно понимаю, что для дизайн тайма надо регить у себя и всю программу делать и отлаживать только на одном хосте, а потом раскинув на разные компьютеры подключение уже делать по заранее записанному GUIDу или имени сервера? Так выходит?
    Просто я думал, что в дизайн тайме можно и с удаленным работать..... Это видать меня и сбило с толку.
    Все верно?
  • DeadMeat (03.10.08 14:59) [28]
    Блин извиняюсь... с тэгами напутал. После обеда голова слабо соображает.
  • Сергей М. © (03.10.08 15:20) [29]

    > подключение уже делать по заранее записанному GUIDу или
    > имени сервера


    Серверной стороне имя MIDAS-сервера не нужно - она работает только с GUID.

    Имя MIDAS-сервера нужно только клиентской стороне, если угодно - как минимум для удобства восприятия пользователем и/или программистом. Согласись, гораздо удобнее оперировать осмысленными именами, нежели длиннющей строкой лишенных смысла символов. Подобно тому как обращаться к хостам в Интернете неизмеримо удобней осуществлять по их доменным именам, а не по IP-адресам, хотя фактическое обращение осуществляется именно по IP-адресам, а функции разрешения имени в адрес возлагаются на распределенную DNS-систему.

    Так вот разрешением имени в GUID как раз и заведуют соответствующие рег.записи в реестре. Если их нет, то разрешение невозможно.
  • DeadMeat (03.10.08 15:35) [30]

    > Сергей М. ©   (03.10.08 15:20) [29]

    Ну насчет GUIDов и IPов все понятно. Я имею ввиду, правильно-ли то, что я понял? Что для процесса разработки (т.е. в дизайн тайме) надо иметь сервер у себя на локальной машине, а перебросив его на другую, делать только все только в рантайме?
  • Сергей М. © (03.10.08 15:47) [31]
    Нет, не правильно. Точнее - не совсем правильно.

    Сам сервер (т.е. его исп.модуль) у себя на лок.машине нужно иметь лишь для отладочных целей, в условиях когда удаленная его отладка невозможна и/или нежелательна. При этом его регистрация у себя на лок.машине, разумеется, обязательна.

    Сервер можно отлаживать и удаленно. В этом случае его регистрация обязательна только на удаленной машине. На локальной же машине регистрация фабрики класса сервера будет нужна только для разрешения имени в адрес, если таковая нужна. Эту регистрацию можно сделать как запустив однократно приложение-сервер на лок.машине (после чего его исп.модуль на лок.машине впредь более не понадобится), так и внеся вручную соотв.записи в реестр.

    Ну а в рантайм или в дизайнтайм происходит фактическое обращение к серверу (где бы он ни находился фактически) - это не имеет принципиально никакого значения.
  • DeadMeat (03.10.08 17:35) [32]

    > Сергей М. ©   (03.10.08 15:47) [31]


    > Эту регистрацию можно сделать как запустив однократно приложение-
    > сервер на лок.машине (после чего его исп.модуль на лок.машине
    > впредь более не понадобится), так и внеся вручную соотв.
    > записи в реестр.

    Ага.. Вот в этом и проблема. Т.к. запустив его просто так, записи не добавились. Пришлось его именно регистрировать. Возникает вопрос, добавлять эти записи (тот ключ, которого не достает) вручную (в смысле самому в реестр) или есть штатный способ для этого? Не таскать же с клиентом постоянно сервер.
    Вот в реальной ситуации уже при установке. Надо у заказчика (допустим) развернуть эту систему.
    Примерные действия (на мой взгляд):
    на машине сервере установка серверной части, путем ее регистрации (/regserver)
    на машине клиенте установка клиентской части, путем ее регистрации
    Вот второй пункт вызывает проблемы. Руками записывать данные в реестр (не хотелось бы) или использовать какой-то штатный способ для этого (хотелось бы)?
  • Сергей М. © (04.10.08 09:44) [33]

    > Руками записывать данные в реестр (не хотелось бы)


    Что-то ты тормозишь откровенно)

    В "боевых" условиях никакой регистрации сервера в реестре на кл.стороне не требуется !

    Если твой боевой клиент знает GUID сервера - этого вполне достаточно.
  • DeadMeat (04.10.08 10:41) [34]
    > [33] Сергей М. ©   (04.10.08 09:44)

    Ну тупой... ну бывает.. ну что вы сразу. ;)
    Просто меня постоянно сбивало с толку то, что в дизайн тайме у меня даже чисто с гуидом ничего не получалось. Я то проверял и этот вариант тоже. Но видать чего-то в другом месте было намучено и не срабатывало.
    Теперь все ясно. Теперь хотя бы не буду ждать того поведения, которое ожидал.
    Так или иначе...
    ОГРОМНОЕ СПАСИБО за потраченное на меня время. Знаю, это не легко.
    Благодарю еще раз... вопрос закрыт.
  • DeadMeat (06.10.08 18:19) [35]
    Так... С этим разобрались. Все работает. Все прекрасно (еще раз спасибо за помощь).
    Теперь такой вопрос возник. Как этот сервер подружить с сервисом?
    Вопрос именно в более-менее "стандартной" дружбе.
    Т.е. регистрация COM объекта руками через WinAPIшные команды это я понял. Нашел как и где. Но вот не хотелось бы к такому прибегать. Хочется стандартное чтото. Чтобы свои штатные IDEшные средства.
    Как например /regserver (ну почти IDEшное).
    Просто в сервисе такое уже не прокатывает, как я понял. Службу та я создаю, а вот как зарегистрировать мой COM сервер "в ней".
    Ожидаемое поведение такое:
    инсталляция службы в систему
    в процессе инсталяции службы, регистрация COM сервера
    запуск службы
    обращение клиента к COM серверу, не вызывающее повторного запуска ЕХЕ файла последнего (как при обычной регистрации сервера без службы)
    деинсталяция службы, дерегистрация COM сервера

    Повторюсь, хотелось бы найти штатные IDEшные или Делфийские средства, а не изощраться спаривая оных с WinAPIшными.
    Я конечно понимаю, что Делфийские так или иначе вызывают WinAPIшные... но вот такое вот странное у меня желание.

    ЗЫ. Пример из кладовки и одну из соответствующих тем на Королевстве смотрел. Это как раз то, чего хотелось бы избежать.
  • Сергей М. © (07.10.08 08:33) [36]

    > Пример из кладовки и одну из соответствующих тем на Королевстве
    > смотрел


    Ссылки приведи ..
  • DeadMeat (07.10.08 10:20) [37]

    > Сергей М. ©   (07.10.08 08:33) [36]

    Даже не знаю... С утра сижу и пытаюсь добавить сюда пост. Потом доперло... скорее всего спаморезка не пускает сразу много ссылок.

    Здесь раз: delphimaster.ru/cgi-bin/http://pda.delphimaster.net/?id=1190904445&n=8
    Оттуда два: delphimaster.ru/cgi-bin/http://pda.delphimaster.net/?id=1158154010&n=8
    И там три: delphikingdom.info/asp/answer.asp?IDAnswer=54223
    Рядом четыре: kladovka.net.ru/index.cgi?pid=dir&rid=24

    Я их не проверял, но примерную суть понял. Все же чтото "постандартней" хотелось бы...
  • Сергей М. © (07.10.08 10:24) [38]
    Понятно.
    И что тебя в примере от Набережных С. (с) не устраивает конкретно ?
  • DeadMeat (07.10.08 10:32) [39]

    > Сергей М. ©   (07.10.08 10:24) [38]

    Конкретно именно громоздоксть всей процедуры регистрации и установки. Т.е. то, что надо делать руками. Именно это и хотелось бы заменить на нечто, более "штатное" чтоли. С одной стороны это может показаться некой глупостью и детским садом, т.к. по сути один раз сделал и забыл. Но тем не менее..... Не могу поверить, что IDE не предоставляет подобных инструментов или визардов (нет нет.. я не избалованный батонокидатель)..
    Но если таких (более "стандартных") средств нет, то конечно будем делать так... но "осень ни хоца" ©
 
Конференция "Базы" » Multi-tier + DCOM
Есть новые Нет новых   [134473   +33][b:0][p:0.005]