思维调试:理解 DDE 的初始化过程

服务器 服务器产品
外壳程序假定 DDE 服务器在输入空闲时已准备好接受连接。一旦 DDE 服务器上的 WaitForInputIdle 返回,资源管理器将第二次尝试启动 DDE 会话。此修复程序是让应用程序在开始处理消息之前启动并运行其 DDE 服务器。

最近有人问我下面这个问题,我们依然可以使用之前我提到的 “思维调试” 来研究研究。

我们碰到了一个技术问题。当在资源管理器中双击打开文档时,资源管理器不会启动我们的应用程序。
更加奇怪的是,如果我们将一个调试器挂接到资源管理器进程,并在 kernel32 模块的 CreateProcessW 处下断点,然后等待 CreateProcess 返回,并在调试器中继续执行,则文档可以正常打开。但是,如果我们不做任何等待,应用程序也可以正常打开,但是它不会加载文档,在这种情况下,我们得到了这样的错误信息:Windows 找不到 ‘abc.lit’。请确保你输入了正确的文档名称,然后重试。
下面是我们使用的命令行:“F:\Program Files\LitSoft\LitWare\LitWare.exe” /dde到底是哪里出了问题呢?

如果你仔细研究过 DDE 初始化的工作原理文章,那么我想你应该已经知道原因了。

回想一下,通过 DDE 打开文档是通过首先查找 DDE 服务器来完成的,如果未找到,则手动启动服务器并重试。上面的命令行显然已注册为与 ddeexec 关联的命令。
我们有两个线索:首先是文档名称本身在命令行上不存在。(这不可能是直接执行,因为程序不知道它应该打开什么文档!但是这条线索是命令行上的短语 /dde。

显然,资源管理器尝试第二个 DDE 对话打开文档时出现问题。让资源管理器等待几秒钟可以解决问题的事实使原因显而易见:DDE 服务器初始化和侦听自身的速度很慢。资源管理器启动服务器并尝试与其通信,但服务器尚未准备就绪,因此不响应 DDE 启动。

如何解决这个问题?

外壳程序假定 DDE 服务器在输入空闲时已准备好接受连接。一旦 DDE 服务器上的 WaitForInputIdle 返回,资源管理器将第二次尝试启动 DDE 会话。此修复程序是让应用程序在开始处理消息之前启动并运行其 DDE 服务器。
我的猜测是应用程序将其 DDE 服务器移动到后台线程以提高启动性能,因为 DDE 服务器不参与正常的程序操作。
但是这太糟糕了,当传递 /dde 标志时,程序忘记在输入空闲之前启动并运行 DDE 服务器。让 DDE 服务器运行很重要,但它错过了正确的时间点。

总结

如果你要实现了一个 DDE 服务器,请确保在主线程开始处理消息之前就启动它。否则,应用程序启动和尝试与之通信的外壳之间存在竞争条件。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2012-03-13 13:38:42

Java

2023-10-06 20:57:52

C++聚合成员

2012-04-09 13:43:12

Java

2023-11-12 23:08:17

C++初始化

2009-06-04 09:26:51

struts 源码struts 资源文件

2009-06-10 16:17:00

Netbeans JT初始化

2021-07-07 05:00:17

初始化源码

2011-03-16 10:52:20

2011-06-17 15:29:44

C#对象初始化器集合初始化器

2010-07-28 10:22:33

FlexApplica

2022-07-06 10:37:45

SpringServlet初始化

2021-03-12 10:30:11

SpringMVC流程初始化

2020-12-03 09:50:52

容器IoC流程

2009-11-11 15:29:15

ADO初始化

2019-11-04 13:50:36

Java数组编程语言

2009-09-08 09:48:34

LINQ初始化数组

2010-01-25 17:48:39

三层交换机端口

2020-11-23 14:22:17

代码Go存储

2012-05-23 12:46:53

JavaJava类

2010-09-08 14:49:09

蓝牙协议栈
点赞
收藏

51CTO技术栈公众号