IOPCShutdown::Advise Failed: ошибка 80040202

Я сломал голову, пока искал причину этой ошибки (4 дня)

  • У меня есть сервер OPC DA, работающий на удаленной машине.
  • Клиент OPC DA находится на другом компьютере.

в клиентской реализации я создаю внешний экземпляр через CoCreateInstanceEx()

HRESULT result = ::CoCreateInstanceEx(clsid, NULL, clsctx, sinptr, 1, &mqi);
PRINT_COMERRORIF(result, "CoCreateInstanceEx failed");

и он отлично работает, и я получаю указатель на удаленный сервер OPC (mqi.pItf)

проблема возникает, когда я вызываю функцию advise() интерфейса IConnectionPoint

Я указываю, что нашел точку подключения и возвращаю указатель на интерфейс IOPCShutdown (_MY_shutdown) перед вызовом функции советую

result = server_object->QueryInterface(IID_IConnectionPointContainer 
(void**)&connection_point_container);
PRINT_COMERRORIF(result, CTXID(this) "No IConnectionPointContainer interface");

result = connection_point_container->FindConnectionPoint(IID_IOPCShutdown, &_MY_shutdown);
PRINT_COMERRORIF(result, CTXID(this) "No IOPCShutdown connection point found");

result = _MY_shutdown->Advise(_MY_shutdown_callback, &_MY_shutdown_cookie); // HERE IS THE ISSUE 
PRINT_COMERRORIF(result, CTXID(this) "IOPCShutdown::Advise Failed");

и я получил эту ошибку:

IOPCShutdown::Advise Failed : error 80040202

Я проверил настройку DCOM для обнаружения Настройка удаленных серверов OPC, и я сделал все, как описано, но никак ;(

Вот моя конфигурация:

Сторона сервера

 - OPC DA Server installed and running

 - local user account is created

 - DCOM settings are configured as required

 - Policy settings are configured as well

Сторона клиента

 - OPC DA client interface installed.

 - local user accounts are created on the both Nodes. Accounts have the same 
   name and passwords like on the server.

Брандмауэр отключен как на сервере, так и на клиенте.


person Agnes    schedule 27.11.2020    source источник
comment
Ошибка 0x80040202 использует FACILITY_ITF, поэтому она специфична для этого IOPCShutdown::Advise. Вы должны спросить продавца, что это значит. В противном случае, дикая догадка, проверили ли вы, что ваш поток работает как STA или MTA. Многие серверы (особенно для событий) поддерживают один или другой (без явного документирования).   -  person Simon Mourier    schedule 27.11.2020
comment
@SimonMourier, чтобы видеть темы, мне нужно установить Process Monitor или аналогичный, проблема в том, что у меня нет прав ...   -  person Agnes    schedule 27.11.2020
comment
Ваш код выполняется в потоках, просто сбрасывает состояние потока, используя, например, это: IComThreadingInfo::GetCurrentApartmentType   -  person Simon Mourier    schedule 27.11.2020
comment
Неправильный комментарий, ошибка IConnectionPoint::Advice. Дает намек на основную проблему, для обратных вызовов все работает наоборот. Вы должны реализовать IOPCShutdown, сервер вызывает QueyInterface вашего интерфейса, чтобы получить указатель интерфейса IOPCShutdown. Если это не удается, то Advice() возвращает 0x80040202 (он же CONNECT_E_NOCONNECTION).   -  person Hans Passant    schedule 27.11.2020
comment
@HansPassant Я думаю, что ::FindConnectionPoint() возвращает указатель на интерфейс IOPCShutdown, если это поддерживаемый исходящий интерфейс, и этот результат не дал сбоев. проблема ::Advise() при попытке установить соединение между точкой подключения (последний указатель) и приемником клиента. Я не вижу источника этой проблемы   -  person Agnes    schedule 30.11.2020


Ответы (2)


Правильно ли вы настроили параметры DCOM и политики на стороне Клиента? Как упоминалось в комментариях, потому что для асинхронных подключений (когда вызывается обратный вызов) ваш клиент ведет себя как сервер, а сервер - как клиент.

person OlegCh    schedule 11.12.2020

Это работает, когда я меняю уровень аутентификации моего сервера OPC DA в DCOM Config с Connect на None, я не знаю почему, но это работает ^^

person Agnes    schedule 23.12.2020