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完后启动失败报错修复后依然各种失败解决方案