Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OPC клиент, Получение списка OPC серверов 
:(
    Опции темы
plica98
Дата 12.11.2013, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Добрый день, уважаемые Коллеги.

Обращаюсь к Вам за помощью. Опыта работы с COM/DCOM практически не имею.
При разработке OPC клиента (Win 7), столкнулся с проблемой получения списка OPC-серверов.
Программа сваливается на CoCreateInstance(). Выдает ошибку:   "Ошибка запроса интерфейса СoCreateInstance  " -NOT SUPPORTED<80040154>


Я так понимаю что не зарегистрирован класс. Как его зарегистрировать ?
Может быть кто-то уже сталкивался с аналогичной проблемой?



Код

#include "stdafx.h"


//==============================================================
#include <locale>
#include <iostream>
#include <WinError.h>
# import "c:\\Windows\system32\opcenum.exe"\
    rename_namespace ("OPCENUM")
 
using namespace OPCENUM;

int    GetOPCServerList()
{
    CLSID clsid;            // индентификатор библиотеки ОРСEnum
    CLSID clsidcat;            //идентифификатор категории ОРС DA серверов
    HRESULT hRes;

// Идентификатор компонента просмотра списка серверов
    hRes=CLSIDFromProgID(L"OPC.ServerList",&clsid);
    if (hRes!=S_OK)
        {
            //Обработка ошибок
            printf("Ошибка получения CLSID CLSIDFromProgID\n");
            return -1;
    }

// Идентификатор категории ОРС DA 2.0
    hRes=CLSIDFromString(L"{63D5F432-CFE4-11D1-B2C8-0060083BA1FB}",&clsidcat);
    if (hRes!=S_OK)
        {
            //Обработка ошибок
            printf("Ошибка получения категории CLSIDFromString\n");
            return -1;
    }

//Идентификатор интерфейса IOPCServerList
    IID IID_IOPCServerList=__uuidof(IOPCServerList);
    IOPCServerList *pIOPCServerList;

// запрос интерфейса у компонента должен вернуть S_OK 
    hRes=CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,IID_IOPCServerList,(void**)&pIOPCServerList);
    if(SUCCEEDED(hRes))
    {
            report("Запрос интерфейса CoCreateInstance - OK!  ",hRes);
    }
    if (FAILED(hRes))
        {
            //Обработка ошибок
            report("Ошибка запроса интерфейса СoCreateInstance  ",hRes); 
            return -1;
    }



Вываливаюсь по ошибке : "Ошибка запроса интерфейса СoCreateInstance  " -NOT SUPPORTED<80040154> . 


// MessageId: REGDB_E_CLASSNOTREG
//
// MessageText:
//
// Class not registered
//
#define REGDB_E_CLASSNOTREG              _HRESULT_TYPEDEF_(0x80040154L)













...............................................................



Это сообщение отредактировал(а) plica98 - 13.11.2013, 12:40
PM MAIL   Вверх
xvr
Дата 13.11.2013, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6984
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 8
Всего: 222



Похоже у клиента не стоит OPC (или криво стоит)

Либо COM класс OPC.ServerList не поддерживает интерфейс IOPCServerList (что странно)

PM MAIL   Вверх
plica98
Дата 14.11.2013, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



XVR, спасибо за внимание к моей проблеме.


Взял чистый комп с Win XP (SP3).

Перенес туда проект. Собрал. Установил OPC сервер (KEPware).
Все работает как надо c небольшой корректировкой проекта:

вместо интерфейса  IOPCServerList  использую интерфейс   IOPCServerList2.

Перенес обратно проект с WIN XP на WIN 7 - картина старая.

Снес на WIN 7  OPC сервер и проинсталлировал заново - ничего не изменилось.

С WIN 7 - надо разбираться. Видимо что-то косо стоит.

Код

#include "stdafx.h"


//==============================================================
#include <locale>
#include <iostream>
#include <WinError.h>
# import "c:\\Windows\system32\opcenum.exe"\
    rename_namespace ("OPCENUM")
 
using namespace OPCENUM;

int    GetOPCServerList()
{
    CLSID clsid;            // индентификатор библиотеки ОРСEnum
    CLSID clsidcat;            //идентифификатор категории ОРС DA серверов
    HRESULT hRes;

// Идентификатор компонента просмотра списка серверов
    hRes=CLSIDFromProgID(L"OPC.ServerList",&clsid);
    if (hRes!=S_OK)
        {
            //Обработка ошибок
            printf("Ошибка получения CLSID CLSIDFromProgID\n");
            return -1;
    }

// Идентификатор категории ОРС DA 2.0
    hRes=CLSIDFromString(L"{63D5F432-CFE4-11D1-B2C8-0060083BA1FB}",&clsidcat);
    if (hRes!=S_OK)
        {
            //Обработка ошибок
            printf("Ошибка получения категории CLSIDFromString\n");
            return -1;
    }

//Идентификатор интерфейса IOPCServerList
    IID IID_IOPCServerList=__uuidof(IOPCServerList2);
    IOPCServerList2 *pIOPCServerList2;

// запрос интерфейса у компонента должен вернуть S_OK 
    hRes=CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,IID_IOPCServerList,(void**)&pIOPCServerList2);
    if(SUCCEEDED(hRes))
    {
            report("Запрос интерфейса CoCreateInstance - OK!  ",hRes);
    }
    if (FAILED(hRes))
        {
            //Обработка ошибок
            report("Ошибка запроса интерфейса СoCreateInstance  ",hRes); 
            return -1;
    }






PM MAIL   Вверх
Google
  Дата 22.5.2019, 13:47 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1080 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.