IOPCShutdown::Advise 失败:错误 80040202

Posted

技术标签:

【中文标题】IOPCShutdown::Advise 失败:错误 80040202【英文标题】:IOPCShutdown::Advise Failed : error 80040202 【发布时间】:2020-11-27 10:52:28 【问题描述】:

在寻找这个错误的原因时我头破了(4天)

我有一个在远程机器上运行的 OPC DA 服务器。 OPC DA 客户端位于另一台机器上。

在客户端实现中,我通过CoCreateInstanceEx()创建了一个外部实例

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

它工作正常,我得到一个指向远程 OPC 服务器的指针 (mqi.pItf)

当我调用IConnectionPoint接口的advise()函数时问题来了

我指定我找到了连接点,并在调用通知函数之前返回一个指向 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 Setting for Discovery of Remote OPC Servers configuration,我按照描述做了所有事情,但没办法;(

这是我的配置:

服务器端

 - 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.

防火墙在服务器/客户端都被禁用。

【问题讨论】:

错误 0x80040202 使用 FACILITY_ITF,因此它特定于此 IOPCShutdown::Advise。你应该问供应商这是什么意思。否则,疯狂猜测,您是否检查过您的线程是作为 STA 还是 MTA 运行的。许多服务器(尤其是事件服务器)支持其中一种(没有明确记录)。 @SimonMourier 查看我需要安装 Process Monitor 或类似的线程,我没有权限的问题... 您的代码在线程中执行,只是使用此转储线程状态:IComThreadingInfo::GetCurrentApartmentType 错误的注释,失败的是 IConnectionPoint::Advice。给出潜在问题的提示,对于回调,事情是相反的。必须是你实现了IOPCShutdown,服务器调用你接口的QueyInterface来获取IOPCShutdown接口指针。如果失败,则 Advice() 返回 0x80040202(又名 CONNECT_E_NOCONNECTION)。 @HansPassant 我认为::FindConnectionPoint() 返回一个指向 IOPCShutdown 接口的指针,如果它是受支持的传出接口并且此结果没有失败。当试图在连接点(最后一个指针)和客户端接收器之间建立连接时,问题是::Advise()。我没有看到这个问题的根源 【参考方案1】:

您是否在 客户端 端正确配置了 DCOM 和策略设置? 如 cmets 中所述,因为对于异步连接(调用回调时),您的客户端充当服务器,而服务器则充当客户端。

【讨论】:

【参考方案2】:

当我在 DCOM Config 中将我的 OPC DA 服务器的身份验证级别从“连接”更改为“无”时,它起作用了,我不知道为什么,但它起作用了^^

【讨论】:

以上是关于IOPCShutdown::Advise 失败:错误 80040202的主要内容,如果未能解决你的问题,请参考以下文章

报错解决telnet时报错:无法打开到主机的连接,在端口23连接失败

npm install完后启动失败报错修复后依然各种失败解决方案

Mongodb 连接失败,怎么避免抛错影响正常流程

secureCRT 安装破解、壁垒机配置及认证失败报错问题处理

REDIS持久化报错失败

小源笔记第六期 | 解决应用申请权限失败导致安装报错问题