问题性质:
我有一个启用宏的 Excel 表,它成功地建立了 DDE 连接并与 ManMan 数据库系统 Minisoft 的终端应用程序进行对话。大约 95% 的时间 DDE 可以正常工作,但有时 (~5%) Excel 和 Minisoft 之间似乎没有任何数据交换。当发生这种情况时,Minisoft shell 会挂起等待数据,基本上锁定了我的工作表,直到它崩溃或用户沮丧地终止 Excel 进程。这种挂起的对话只会在打开外壳后对话开始时发生,而且它似乎是随机发生的(我可以执行工作表的 VBA 3 次,然后它挂起,或者我可以执行 50 次,它永远不会挂起)。一旦发生 DDE 挂起,它会在随后的每次执行尝试中挂起(即使我关闭 Excel/Minisoft 并重新打开),直到我重新启动机器或注销并重新登录 Windows,似乎没有其他方法可以解决这个问题。如果有人对可能导致此问题的原因有任何见解,请告诉我。我需要能够防止它或检测何时发生这种挂起。
代码和附加信息:
Public channel As Long
Public Sub StartManMan(login As String, HpPass As String, manPass As String, accountPass As String)
Dim MiniPath As String
Dim Retval
MiniPath = ":\Minisoft\WS92-2\Ws92_32.exe"
On Error Resume Next
Retval = Shell("D" & MiniPath, vbNormalNoFocus)
On Error Resume Next
Retval = Shell("C" & MiniPath, vbNormalNoFocus)
On Error Resume Next
Retval = Shell("E" & MiniPath, vbNormalNoFocus)
channel = 0
While channel = 0
channel = Application.DDEInitiate("MS92-2", "S92")
Wend
DDETimeQuick
Application.DDEExecute channel, "WAITS ':^Q'"
Application.DDEExecute channel, "KBSTRING HELLO " & UCase(login) & ".UNITED"
Application.DDEExecute channel, "DISPLAY '^[H^[J'"
Application.DDEExecute channel, "KBSPEC HP_RETRNKEY"
DDETimeQuick
Application.DDEExecute channel, "WAITS ':^Q'"
Application.DDEExecute channel, "KBSTRING " & UCase(accountPass)
Application.DDEExecute channel, "KBSPEC HP_RETRNKEY"
DDETimeQuick
Application.DDEExecute channel, "WAITS ':^Q'"
Application.DDEExecute channel, "KBSTRING " & UCase(HpPass)
Application.DDEExecute channel, "DISPLAY '^[H^[J'"
Application.DDEExecute channel, "KBSPEC HP_RETRNKEY"
DDETimeQuick
Application.DDEExecute channel, "WAITS '.^Q'"
Application.DDEExecute channel, "KBSPEC HP_RETRNKEY"
DDETimeQuick
Application.DDEExecute channel, "WAITS ' ^Q'"
Application.DDEExecute channel, "KBSTRING 1"
Application.DDEExecute channel, "KBSPEC HP_RETRNKEY"
DDETimeQuick
Application.DDEExecute channel, "WAITS ' ^Q'"
Application.DDEExecute channel, "KBSTRING " & UCase(manPass)
Application.DDEExecute channel, "KBSPEC HP_RETRNKEY"
DDETimeQuick
Application.DDEExecute channel, "WAITS '^H^Q'"
End Sub
Public Sub DDETimeQuick()
Application.DDEExecute channel, "TIMER 120"
Application.DDEExecute channel, "ONTIMER"
End Sub
DDE 传递给 Minisoft 终端的字符串是触发所需输出的关键字。问题不在于沟通的内容,而在于沟通的能力。当问题发生时,我相信它发生在 StartManMan Sub 中。终端已启动,但似乎没有任何字符串被传递到终端,因为它只是无限期地处于静止状态(等待击键 - 用户可以直接与终端交互,终端本身是响应式的)并且 Excel 仍然无法使用忙着执行代码。只有当我没有从“KBSTRING HELLO”中看到“HELLO”的输出时,才会出现此问题。如果我确实看到“HELLO”,那么它总是在 100% 的时间里完美运行。
我已经阅读了以下关于挂起的内容: http ://www.angelfire.com/biz/rhaminisys/ddeinfo.html#DDEslow 并意识到它可能与线程相关,但如果是这样的话,那只会改变我的问题的重点(如何我要防止/检测到这一点吗?)。此外,引用的错误文章 Q136218 也不再可用。