DdeConnect返回DMLERR_NO_CONV_ESTABLISHED错误排查求助
问题根源
你当前代码存在三个核心错误导致无法建立DDE连接:
- 初始化参数配置错误:服务端和客户端都使用了仅DDE监控程序适用的
APPCLASS_MONITOR标识,该模式下程序无法处理普通的DDE会话请求 - 服务端连接请求处理逻辑错误:收到
XTYP_CONNECT连接请求时返回NULL,代表主动拒绝连接 - 客户端冗余配置:客户端不需要调用
DdeNameService注册自身服务名,该操作仅服务端需要
具体修改方案
1. 服务端修改
- 替换
DdeInitializeA的配置参数,改为服务端标准配置:
uResult = DdeInitializeA( &pidInst, DdeCallback, APPCLASS_STANDARD, 0);
- 修改
XTYP_CONNECT分支返回值,接受合法连接请求:
case XTYP_CONNECT: std::cout << "DDE Callback XTYP_CONNECT" << std::endl; // 可自行添加服务名、主题名校验逻辑,校验通过返回TRUE即可 return (HDDEDATA)TRUE;
2. 客户端修改
- 替换
DdeInitializeA的配置参数,改为客户端标准配置,和上面服务端的初始化配置一致即可 - 删除客户端中冗余的服务名注册代码:
// 删除以下两行代码,客户端不需要注册自身服务名 HSZ stringHandle = DdeCreateStringHandleA(pidInst, "MyDdeClient", CP_WINANSI); DdeNameService(pidInst, stringHandle, 0, DNS_REGISTER);
验证流程
修改完成后,先启动服务端程序,再启动客户端程序,即可看到服务端打印XTYP_CONNECT日志,客户端DdeConnect返回有效会话句柄,连接建立成功。
内容的提问来源于stack exchange,提问作者Malcolm McCaffery
相关产品推荐
相关产品推荐

