S>подскажите как можно получить CLSID для удаленного COM сервера по его имени (ProgId).
а можно вопрос зачем таким сложным путем если можно напрямую использовать CLSID путем импорта из TLB? или вам для VBScript это надо?
все равно информация о CLassID, ProdID и AppID берется из локального реестра, даже если объект запускается удаленно
Re[2]: Получение CLSID по ProgId для удаленного сервера
Здравствуйте Awaken, Вы писали:
S>>подскажите как можно получить CLSID для удаленного COM сервера по его имени (ProgId).
A>а можно вопрос зачем таким сложным путем если можно напрямую использовать CLSID путем импорта из TLB? или вам для VBScript это надо? A>все равно информация о CLassID, ProdID и AppID берется из локального реестра, даже если объект запускается удаленно
Я пытаюсь подключиться к удаленному OPC серверу. На локальном компе он не зарегистрирован. CLSIDа в реестре нет. Есть только имя ProdId и NodeName удаленного компа.
Re[3]: Получение CLSID по ProgId для удаленного сервера
Здравствуйте Sevig, Вы писали:
S>Здравствуйте Awaken, Вы писали:
S>>>подскажите как можно получить CLSID для удаленного COM сервера по его имени (ProgId).
A>>а можно вопрос зачем таким сложным путем если можно напрямую использовать CLSID путем импорта из TLB? или вам для VBScript это надо? A>>все равно информация о CLassID, ProdID и AppID берется из локального реестра, даже если объект запускается удаленно
S>Я пытаюсь подключиться к удаленному OPC серверу. На локальном компе он не зарегистрирован. CLSIDа в реестре нет. Есть только имя ProdId и NodeName удаленного компа.
Без прокси — безнадежное занятие.
Re[4]: Получение CLSID по ProgId для удаленного сервера
Здравствуйте Vi2, Вы писали:
Vi2>Здравствуйте Sevig, Вы писали:
S>>Я пытаюсь подключиться к удаленному OPC серверу. На локальном компе он не зарегистрирован.
Vi2>И ты думаешь его достать? И если пытаешься, то через какие функции?
S>>CLSIDа в реестре нет. Есть только имя ProdId и NodeName удаленного компа.
Vi2>И даже если продерёшься, что ты с ним будешь таким делать?
Не понимаю, а в чем проблема то ?
MULTI_QI mqi;
COSERVERINFO sin, *sinptr;
DWORD clsctx;
// set up server info
//
if(szNodeName)
{
sinptr = &sin;
sin.dwReserved1 = 0;
sin.dwReserved2 = 0;
sin.pwszName = szNodeName;
sin.pAuthInfo = 0;
clsctx = CLSCTX_REMOTE_SERVER;
}
else
{
// Локальный
sinptr = 0; // pointer should be NULL if local
clsctx = CLSCTX_LOCAL_SERVER;
}
// set up mqi
//
mqi.pIID = &IID_IOPCServer; //&IID_IUnknown;
mqi.hr = 0;
mqi.pItf = 0;
// Note you must define _WIN32_DCOM in 'Settings'
hResult = CoCreateInstanceEx(CLSID_OPCServer, NULL,
clsctx, sinptr, 1, &mqi);
...
pIOPCServer=(IOPCServer*)mqi.pItf;
Получили указатель на интерфейсик и вперед
Но где взять CLSID_OPCServer ?
Если его взять с локального, все работает, проверял.
Re[5]: Получение CLSID по ProgId для удаленного сервера
[]
S>Но где взять CLSID_OPCServer ? S>Если его взять с локального, все работает, проверял.
Ну и что, что ты его получишь. Ну предположим тебе повезло и на удаленной машине запущен сервис regsvr.exe. Ты приконекчиваешься к нему (RegConnectRegistry) находишь ProgId, CLSID и проч. Подставляешь его в CoCreateInstanceEx. СОМ ищет его на локальной машине! Так хорошо, тогда мы прописываем его на локальной машине. Снова вызываем CoCreateInstanceEx, если повезет (безопастность сервака настроена, например) СОМ создаст объект, однако при она вернет тебе E_NOINTERFACE (или чего-нибудь в этом духе), потому что локально интерфейс не зарегестрирован.
Для его регистрации нужна запись в реестре HKCR\Interfaces, библиотека типа (для стандартного маршалера) или прокся (если используется не стандартный). Где их взять? В принципе можно опять залезть на сервак, покопаться там в реестре и все такое, но это ламерство.
Обычно, для обеспечения возможности создания удаленного экземпляра сервака проводят последовательность административных действий. Например таких (стандартный маршалер):
1. Регистрация кокласса на сервере, включая библиотеку типа и инфу по AppID
2. Настройка безопастности с помощью dcomcnfg
3. Копирование на клиент библиотеки типа и reg-файла для модификации HKCR\CLSID (я пользую ATL-ный rgs)
4. Регистрация биб. типа и reg-файла
5. Только теперь попытка создания удаленного сервака.
Re: Получение CLSID по ProgId для удаленного сервера
Здравствуйте Sevig, Вы писали:
S>подскажите как можно получить CLSID для удаленного COM сервера по его имени (ProgId).
S>Что то похожее на CLSIDFromProgID для удаленного сервера есть ?
Мы для решения таких проблем сделали дизайн-таймный компонентик который работает на сервере. В рантайме храним CLSID.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Получение CLSID по ProgId для удаленного сервера
Здравствуйте Алекс, Вы писали:
А>Для его регистрации нужна запись в реестре HKCR\Interfaces, библиотека типа (для стандартного маршалера) или прокся (если используется не стандартный). Где их взять? В принципе можно опять залезть на сервак, покопаться там в реестре и все такое, но это ламерство.
Так работать вроде как предполагается только через интерфейсы OPC, а они все стандартные. И прокси к ним можно скачать с сайта OPC Fundation.
Для получения CLSID'а OPC сервера можно воспользоваться программкой OpcEnum.exe, если таковая стоит на серверном компьютере (по-хорошему должна стоять, так как ею пользуются многие OPC-браузеры). Объект, который сидит в OpcEnum.exe, поддерживает интерфейс IOPCServerList с методом
Здравствуйте greatvict, Вы писали:
G>Так работать вроде как предполагается только через интерфейсы OPC, а они все стандартные. И прокси к ним можно скачать с сайта OPC Fundation. G>Для получения CLSID'а OPC сервера можно воспользоваться программкой OpcEnum.exe, если таковая стоит на серверном компьютере (по-хорошему должна стоять, так как ею пользуются многие OPC-браузеры). Объект, который сидит в OpcEnum.exe, поддерживает интерфейс IOPCServerList с методом
Здравствуйте Sevig, Вы писали:
S>Не могу настроить DCOM для OPCEnum. Для тестирования использую OPCEnumTest. S>Отвратный резалт 80070005 CoCreateInstanceEx — отказано в доступе...
S>На сервере Win2000Server S>На клиенте Win XP. S>Обе машины ни в одном домене не сидят. S>в dcomcnfg пробовал практически все варианты.
Мы используем следующие настройки —
1.
Глобально —
Default authentification level — Connect
Default impersonation level — Identify
3.
Если же сеть не содержит доменов (как в вашем случае), то на серверном компьютере должен быть зарегистрирован пользователь с тем же именем и паролем, как и на клиентском компьютере.
4.
В некоторых ситуациях нужно установить на закладке Identity конкретного юзера ("The launching user" не всегда работает)