Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > OPC клиент


Автор: plica98 12.11.2013, 13:52
Добрый день, уважаемые Коллеги.

Обращаюсь к Вам за помощью. Опыта работы с 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)













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


Автор: xvr 13.11.2013, 14:37
Похоже у клиента не стоит OPC (или криво стоит)

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

Автор: plica98 14.11.2013, 13:21
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;
    }






Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)