powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / СOM EXE VFP -> DCOM ?
25 сообщений из 27, страница 1 из 2
СOM EXE VFP -> DCOM ?
    #32542719
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Подскажите, как мне СOM EXE VFP превратить в DCOM, что нужно настраивать на машине на которой будет выполнятся компонента ? И как мне создавать
объект из этого контрола в клиенте если он выполняется на другой машине ?
Это вообще можно сделать ?
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32542850
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, регистрируеш как DCOM, там есть утилита DCOMCNFG.exe в доках много описано. DCOM это тотже COM только в "ссылке" на него стоит адрес другой машины.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32542886
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только не понятно мне одно.
Установил я coмпоненту на свою машину. И поставил эту же компоненту на другую машину.
Исчерпал объект локальной версии свой ресурс(критерии я сам устанавливаю) нужно запустить еще один, но тот который на другой машине. Как я его на своей машине должен зарегестрировать ? С помщью DCOMCFG ? А дергать как ?
Объясните, плиз, если не трудно. Очень надо.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32543959
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть сервер - Srv.exe и Клиент - Cli.exe
И два компьютера - локальный и удаленный

Сначала на локальном и удаленном - srv.exe /regserver

Клиент, которому нужен локальный объект вызывает:
CREATEOBJECT('Srv.Class')

Клиент, которому нужен удаленный объект вызывает:
CREATEOBJECT EX ('Srv.Class', 'имя удаленного компьютера')

Вроде все
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32543965
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыл, что все это нужно сконфигурировать с помощью DCOMCNFG (разрешить DCOM, раздать права)
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32544482
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То oleg_km : Спасибо!

Вопрос насчет настройки DCOMCNFG. Свой сервер я там вижу. Но там настраивается запуск :
1 . На локальном компе (?)
2. На компе где находятся данные (?)
3. На выбранном компе (?).

Мне нужно будет запускать этот сервер на 4 разных компах. 1 запуск на моем локальном.

Какие настройки ставить чтобы сервер стартовал:
obj1= CREATEOBJECTEX('Srv.Class', 'имя удаленного компьютера1')
obj2= CREATEOBJECTEX('Srv.Class', 'имя удаленного компьютера2')
obj3= CREATEOBJECTEX('Srv.Class', 'имя удаленного компьютера3')
obj4= CREATEOBJECTEX('Srv.Class', 'мой комп')

Буду признателен за ответы.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32544486
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуста, а из RTL что нужно для работы сервера и где это добро должно лежать на удаленной машине ?
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32544576
Из RTL нужно всё, кроме ресурсов (vfpNrrus.dll) - если Ваш COM-сервер создан не на основе визуального класса и не пользует разные окна.
Обязательно включите в проекте в узел Other->TextFiles файл config.fpw с определением кодовой страницы.
CREATEOBJECTEX для вызова на удалённых машинах не пользовался. Делал только под ASP в IIS - но это немного другое. Достаточно было зарегистрировать EXE COM на сервере, вызвав его с ключем regserver .

Вообще-то сложная какая-то у Вас архитектура (и непонятная).

Успехов!!!
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32544603
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Архитектура..хммм.. возможно.
Посоветуйте , буду только рад за конструктивные предложения.
Задача:
Система представляет из себя некоторую станцию коммутации каналов, работающую с оборудованием по COM портам. Каждый порт обслуживает 4 устройсва. COM сервер в своем функционале содержит функции , в соответсвии с протоколом (запись , чтение, инициализаци, режимы) управления. Нужно добится максимального уменьшения времени на обработку данных которые приходят из потов. Соответсвенно портов на каждой машине
можно повтыкать 255, но тогда как бы асихронно не выполялись методы COM -объектов, все равно машина начинает притормаживать, что недопустимо(!). Вот и приходится разносить сервера по отдельным машинам чтобы добиться максимальной эффективности обработки потока данных из портов, А клиенту передавать только события о смене состояний устройств.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32544634
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если честно, никогда CREATEOBJECTEX не пользовался, т.к. у меня серверный компонент стоит только на одном компьютере, поэтому на клиентах запускаю clireg и по CREATEOBJECTи все работает. Я думаю, нужно попробовать на клиенте запустить clireg с указанием одного из серверов, а потом вызывая ч/з CREATEOBJECTEX нужный компьютер будет запускаться нужный.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32544645
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег,не совсем понял тебя насчет clireg, можно подробней что и где запускать
чтобы я точно запускал свой компонент именно на той машине на которой хочу ? Или не запускал, есть еще и резерв который стартовать должен при сбое в работе основного ядра серверов обслуживающих в общей совокупности некоторое количество портов или при превышении нагрузки.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545050
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю все так как вы говорите.
Пытаюсь создать екземпляр объекта
ostock=CREATEOBJECTEX("comdll.test","Oper")
Мне выскакивает сообщение : Отказано в доступе.
Что делать?
На машине клиента зарегестрировал
на машине сервера зарегестрировал
На машине сервера настроил DCOM - запускать на локальной машине
Выполнил CLIREG comdllex.vbr -s 192.168.0.1 на клиенте
В чем трабл? Подозоеваю что с правами перемудрил или недомудрил.
Как настроить права ? Помогите пожалуйста !
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545058
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на всех клиентах:
clireg32 <твоя программа-сервер>.vbr -s <какой-нибудь сервер> -d -p ncacn_ip_tcp -l

А в программе вызывай CREATEOBJECTEX('srv.class', 'Нужный тебе сервер')
я так думаю, что указание в CREATEOBJECTEX сервера, отличного от указанного в clireg32 в нужном тебе случае "переназначит" на нужный компьютер
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545072
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Клиент 1.
Серверов, пока тож 1.
делаю:
clireg32 <программа-сервер>.vbr -s <сервер> ,
-d -p ncacn_ip_tcp -l - это не делал, но думаю что не суть важно.
Что настраивать в DCOM на строне клиента для компоненты и на строне сервера для компоненты или вообще ни трогать ? И что с правами делать ? Или ничего ни делать ?
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545085
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вру.
Я делаю clireg, clireg32 я вообще найти не могу. Если это принципиально, то где это добро валяется ?
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545194
Привожу выдержку из MSDN VS 6. Может, поможет.

To configure DCOM on the server for remote debugging

1. From the Windows® Start menu on the server, choose Run, and then in the Open box type Dcomcnfg.exe at the prompt.

2. In the Distributed COM Configuration Properties window, select Machine Debug Manager, and then choose Properties to display the Machine Debug Manager Properties dialog box.

3. In the Security tab, choose Use custom access permissions, and then choose Edit.

4. In the Registry Value Permissions dialog box, verify that Allow Access is selected in the Type of Access list, and then choose Add.

5. In the Add Users and Groups dialog box, select the server's name from the List Names From list. The server name typically is in the form \\server and appears at the top of the list.

6. Under Names, choose Administrators, choose Add, and then choose OK.

7. Return to the Security tab, choose Use custom launch permissions, and then choose Edit.
Verify that Allow Launch is selected in the Type of Access list, choose Add, and then add administrators as you did in Steps 4 through 6.

8. Return to the Distributed COM Configuration Properties window, select MTS Client Export, and then choose Properties. Repeat Steps 4 through 7.

9. Return to the Distributed COM Configuration Properties window, select Catalog Class, and then choose Properties. Repeat Steps 4 through 7.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545209
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясное дело поможет. "Потрахаюсь" недельки 2 и методом научного тыка все получится, как обычно. Хотелось бы обсуждения. Кто что делал, как делал. Не в жизни ни поверю что никто не делал. Проблема-то просто свелась к вопросу : как настроить DCOM чтобы запустить на другой машине написанный на VFP компонент. Увы, в английском не силен, немецкий учил.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545305
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем-то, там все просто.
Для начала - какая ОС не клиенте и на сервере

Далее на сервере - запускаем DCOMCNFG, ищем в ListBox свой класс, открываем Property, открываем вкладку Доступы, везде отменяем по умолчанию, заходим в ACL и добавляем кого нужно. Если на сервере ОС - Win9x - обязательно нужно включить в настройках сети - управление доступо "На уровне пользователей", по крайней мере у меня по другому не работало. Вроде все, пробуй
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545322
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ХР и на клиенте и на сервере.
А вот такой вопрос, а я должен на сервер тож прописаться с таким же именем
и паролем и войти в сеанс именно под ними как и на клиенте авторизуюсь ?
Или это не важно ?
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32545369
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сервере:
Смотря что выбрано на сервере на вкладке Identity
Если The interactive user (у меня так) - то сервер запускается от залогиненного НА СЕРВЕРЕ пользователя (если никто не залогинен будет облом)
Если The launching user - то от имени пользователя НА КЛИЕНТЕ (стоит по умолчанию) - самый плохой вариант, т.к. права клиентов часто для сервера ущербные, если нужно чтобы сервер в нужных местах проверял права пользователя на клиенте - используй имперсонацию
Если This user - явно указываешь пользователя - как в SQL. Наверное, самый лучший вариант, т.к. серверный компонент будет работать даже если никто не залогинился на сервере, но нужно учитывать, что процесс будет запущен в невидимой тебе Desktop'е, поэтому если он выводит сообщения об ошибке, ты их никогда не увидишь. Поэтому я не использую этот вариант - иногда что-то где-то вылазит.

На клиенте:
обязательно кто-то должен быть залогинен. Без входа в сеть ничего не рабоает, я и Гостя включал - ничего не помогает. Если кто знает - как вызвать DCOM не входя в сеть - очень будет интересно услышать
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32546009
Очень меня это заитересовало.

Решение.

Два компа, XP Prof
На моём фокс установлен, на втором - нет.
Что сделал:
1. Написал простой EXE COM-сервер
2. Создал SETUP-проект при помощи Install Shield For VFP, в который включил необходимые RTL

Дальнейшие действия на втором компе (где будет COM-сервер)

3. Запустил SETUP (выполняется установка проги и RTL)
4. Зарегистрировал COM-сервер (ключ regserver )
5. Вызвал DCOMCNFG :
- Открыл узел "Службы компонентов" -> "Компьютеры" -> "Мой компьютер" -> "Настройка DCOM"
- Нашёл свой COM-сервер и щёлкнул по нему правой кнопкой; в меню выбрал "Свойства"
- На вкладке "Безопасность" в блоке "Разрешение на запуск" выбрал "Настроить" и нажал кнопку "Изменить"
- Далее в последовательно появляющихся окнах: "Добавить", "Дополнительно", "Поиск"
- Здесь можно выбрать себя или "Authenticated Users" (Прошедшие проверку) - т.е. Вы зарегистрированы на Вашем сервере.

И всё.
В своей проге:

oSVR = CREATEOBJECTEX('мой_COM-сервер','чужой_комп')

И всё заработало!
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32546155
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да все именно так.
Но иногда нужно еще изменить Identity
По умолчанию оно стоит The launching user, но этих прав на сервере может не хватить (запрещена работа на сервере не-Администраторам или др.)
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32546459
to Гость_xxx - если ещё заглянете в этот топик

Вы пишите:
А клиенту передавать только события о смене состояний устройств
Вы используете EVENTHANDLER() ? Если можно, расскажите поподробнее, как Ваш COM-сервер генерит события и как они отлавливаются и обрабатываются на клиенте.
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32550757
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помучался я с этим EVENTHANDLER(). Не работает он. А вот ранее связываение прописанное ручками и создание CALLBACK функций работает прекрасно. По краней мере на локальной машине работает.

На клиенте пишу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#Define PATH_FLL "C:\VFP_UTILITES\COM_DLL"
 Set Library To flib.fll Additive

oCallback = NEWOBJECT("cCallback")    &&  сделали калбак
ostock= newOBJECT("comdll.test")       &&  мой Com-сервер
WITH ostock
.setcallback(oCallBack)         &&   Тут ранее связвание сделали
 .CoSetPatch(PATH_FLL)       &&   Дальше инициализация и работа
 .CoInitLib()
.CoInitPort("\\.\\COM1")
= RunComVFP(Sys( 3095 ,ostock)) 
ENDWITH

*RunComVFP - Это функция из FLL, запускает асинхронно (работает в потоке, *маршалит данные сервера на клиента и обатно) метод 
*моего сервера. Пока сделано так, есть возможность  перенести в сам сервер
*но тогда  нужно будет в сервере создать еще один интерфейс  и перенести 
* в него весть функцианал. 

DEFINE CLASS cCallback as session
   implements iCom1Events in comdllex.tlb 
   procedure iCom1Events_BeforeBuyStock()
      ? "BeforeBuyStock"
   procedure iCom1Events_AfterBuyStock(p as String) as String
      ? "Получно байт из порта ", DecToHex(p)
ENDDEFINE
Сам сервер:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
Define Class Test As Session OlePublic
    pDisp = 0 
    nPort = 0 
    hCom  = 0 
    oc = .Null.
    nСadr =  0 

    Procedure Init
    This.SetCallBack(.Null., 0 )
    Endproc

****************************************
* Функция обратного вызова
* Установка функции:
* oc - объекта  чей интерфейс надо получить
* Num -  номер порта для раннего связывания с интерфейсом
****************************************
    Procedure SetCallBack(oc As Variant)
    If Isnull(oc)
        This.oc = Newobject("Com1Events")
        Return
    Endif
    If Vartype(oc) != 'O'
        Comreturnerror(Program()," Ошибка. Допускается только тип данных бъект")
        Return
    Endif
     This.oc = Getinterface(oc,"Icom1events","comdll.test")
    Endproc

*****************************************
* Ловушка собщений порта
*****************************************
    Procedure BuyStock() As Boolean
    Local lcStrIn As String
    This.oc.BeforeBuyStock() 
    lcStrIn = ReadData(This.hCom)
    This.oc.AfterBuyStock(lcStrIn)
    Endproc

    Procedure CoInitPort(cCom As String)
    This.hCom = InitCOM(cCom)
    Return  This.hCom
    Endproc

*****************************************
* Закрыть порт
*****************************************
    Procedure CoClosePort
    Return CLOSEPORT(This.hCom)
    Endproc

    Procedure CoInitLib() As Variant
    If (Atc("FLIB",Set("LIBRARY"))= 0 )
        Set Library To flib.fll Additive
    Endif
    Return  Set("LIBRARY")
    Endproc

********************************************
*  У становить путь для контрола
*  Возвращает установленный путь
********************************************
    Procedure CoSetPatch(cPatchForLibrary As Variant) As Variant
    Declare Integer GetCurrentDirectory In Win32Api Integer, String @
    Declare Integer GetSystemDirectory In Win32Api String @, Integer
    Local ln_MaxSize As Integer
    ln_MaxSize =  255 
    Local  lc_BuffSystemDir,lc_BuffCurrentDir,lc_OldPatch,;
        lc_PatchComponent,lcNewPath As String
    Store Space(ln_MaxSize) To lc_BuffSystemDir,lc_BuffCurrentDir
    GetCurrentDirectory(ln_MaxSize,@lc_BuffCurrentDir)
    GetSystemDirectory(@lc_BuffSystemDir,ln_MaxSize)
    lc_PatchComponent=Addbs(cPatchForLibrary)
    lc_OldPatch = Set("PATH")
    lcNewPath =  Addbs(Alltrim(lc_BuffCurrentDir))+";";
        +Addbs(Alltrim(lc_BuffSystemDir))+";"+;
        lc_PatchComponent+';'+;
        lc_OldPatch
    Set Path To (lcNewPath)
    Return lcNewPath
    Endproc

    Function Error(nError, cMethod, nLine)
    Comreturnerror(cMethod+'  err#='+Str(nError, 5 )+;
        '  line='+Str(nLine, 6 )+' '+Message(),_vfp.ServerName)
Enddefine
В сервере прописываем еще интерфес

Код: plaintext
1.
2.
3.
4.
Define Class Com1Events As Session OlePublic
    Procedure BeforeBuyStock()
    Procedure AfterBuyStock(p As String) As String
    Return p
Enddefine
Все работает.

А вот с DCOM не пробовал, не знаю сумеет ли DCOM смаршалить данные и указатель IDispatch за граница процесса.
Тут Кстати много вопросов, по завлению микрософта в 2000 виндах есть возможность дернуть метод интерфейса асинхронно, но для этого в IDL компоненты для интерфеса должно быть объявление что это можно делать.
Так вот typelib фокса из которого получается IDL компилятором MIDL не содержит такого объявления. (Должно быть объявление интерфеса с префиксом async_) Пришлось ручками писать на C++ обертку для
асинхронно выполнения метода COM сервера. Что это добро работает на локальной машине это точно, на удаленной не пробовал. Сомневаюсь я что заработает, тогда что делать ?
...
Рейтинг: 0 / 0
СOM EXE VFP -> DCOM ?
    #32550857
to Гость_ххх

Спасибо за ответ и код. Но помочь уже ничем не могу. Сам сейчас читаю книжку Трельсена "Модель COM..." - хочу достичь понимания того, как всё это работает. Есть тут задумка сделать распределённое приложение. Начальству один хрен - лишь бы работало, но хочется, чтобы красиво было...
Может, Вам стоит попробовать спросить у Михаила Дроздова? Он вроде занимался этой проблемой.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / СOM EXE VFP -> DCOM ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]