Доброго времени суток! Года два назад написал OPC-клиент, который успешно функционировал со всем разнообразием OPC-серверов, предложенных ему. И вот появился на горизонте PcVue со своим OPC-сервером. Я нормально получаю CLSID и на CoGetClassObject() все заканчивается с кодом 0x80040154 "Class not registered". Причем другие OPC-клиенты, например, Matrikon OPC Explorer, нормально с ним работают. Может быть, есть мысль, почему так может быть? Спасибо!
ЗЫ: Все исключительно на локальной машине
Я нормально получаю CLSID и на CoGetClassObject() все заканчивается с кодом 0x80040154 "Class not registered".
Не работал с этим и точно проблемы не знаю, но, в качестве предположения: попробуй другую битность, если сейчас собираешь под 64-бита, то попробуй под 32 или наоборот.
Здравствуйте, VVV, Вы писали:
VVV>Не работал с этим и точно проблемы не знаю, но, в качестве предположения: попробуй другую битность, если сейчас собираешь под 64-бита, то попробуй под 32 или наоборот.
Сегодня как раз занимался этим вопросом. Пробовал всякие варианты: 32 — 64, 32 — 32 и т.д. все, короче говоря. Видимо, дело не в этом. Главное, что записи в реестре есть (т.е. в AppID есть такой CLSID), а он говорит, что класс не зарегистрирован. М/б Есть какая-то дока,в которой прописано, что должно быть в реестре, чтобы это было 100% корректно? В этом случае можно будет сделать выводы в чем дело: в неправильной регистрации OPC-сервера или копать в другую сторону.
Ну, проверить ещё CLSCTX:
REGDB_E_CLASSNOTREG
A specified class is not registered in the registration database. Also can indicate that the type of server you requested in the CLSCTX enumeration is not registered or the values for the server types in the registry are corrupt.
Здравствуйте, VVV, Вы писали:
VVV>Здравствуйте, plastictown, Вы писали:
VVV>Ну, проверить ещё CLSCTX: VVV>REGDB_E_CLASSNOTREG VVV>A specified class is not registered in the registration database. Also can indicate that the type of server you requested in the CLSCTX enumeration is not registered or the values for the server types in the registry are corrupt.
Серверы только локальные, использую CLSCTX_LOCAL_SERVER. Глянул дебагером, что там у Matrikon OPC Explorer в этом вызове, а там 5. Это получается CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER. При таких параметрах не работает вообще ничего. Я в замешательстве.
Здравствуйте, plastictown, Вы писали:
P>Серверы только локальные, использую CLSCTX_LOCAL_SERVER. Глянул дебагером, что там у Matrikon OPC Explorer в этом вызове, а там 5. Это получается CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER. При таких параметрах не работает вообще ничего. Я в замешательстве.
Лучше бы выложил как зарегистрирован твой "PcVue с OPC-сервером" — было бы больше информации.
CLSCTX_LOCAL_SERVER требует наличия EXE сервера или DLL сервера в суррогате. В этом случае разрядность клиента и сервера не играет роли.
Если PcVue не откликается, то возможно:
— разные учётные записи
— у PcVue нет локального сервера, а есть только DLL (без суррогата)
Скачал исходники IndigoScada, там клиент opcda вообще не вызывает эту функцию. Я не силен в COM, но сколько я смотрел всяких туториалов, везде порядок действий примерно одинаковый.
Здравствуйте, plastictown, Вы писали:
P>Там же много всякого. Нашел еще один сервер, который тоже ломается с такой же ошибкой. P>Insat OPC
Устанавливать я не буду, уж прости.
P>Мне кажется, я объясню хуже, чем если посмотреть на установленный. И так же Matrikon OPC Explorer нормально с ним работает, P>а у меня все ломается тут:
Это обычный запрос: таких делается тысячи в день.
P>Скачал исходники IndigoScada, там клиент opcda вообще не вызывает эту функцию. Я не силен в COM, но сколько я смотрел всяких туториалов, везде порядок действий примерно одинаковый.
Ну значит вызывает некую CoCreateInstance, которая внутри уже сама вызывает CoGetClassObject.
Но...
Раз ты пишешь, что у тебя раньше работало, но с каким-то одним перестало, то проблема очевидно в регистрации этого какого-то одного. Вот эту цепочку, начиная с CLSID или ProgID, тем более что этот CLSID или ProgID ты знаешь, и нужно показать. Где-то в ветке реестра HKCR\<ProgID> или HKCR\CLSID\{<CLSID>} или где-нибудь в HKCU\Software\Classes\WOW6432Node.