为什么(或如何检测)我的DDE会话从Excel中随机挂起?

问题的性质

我有一个macros启用的Excel表,成功地build立了与ManMan数据库系统Minisoft的terminal应用程序的DDE连接和对话。 大约95%的时间DDE工作正常,但有时(〜5%)似乎没有任何数据交换之间的Excel和Minisoft。 发生这种情况时,Minisoft shell挂起,等待数据locking我的工作表,直到崩溃或用户终止Excel进程。 这种挂在对话中的事情只会发生在shell打开之后的对话开始时,它似乎是随机发生的(我可以执行这个表的VBA三次,挂起或者我可以执行五十次而不会挂起)。 一旦发生DDE挂起,它将在每次执行尝试(即使我closuresExcel / Minisoft并重新打开)之前挂起,直到我重新启动机器或注销并重新login到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传递给Minisoftterminal的string是关键字,用于触发所需的输出。 问题不在于沟通,而在于交stream的能力。 当问题发生的时候,我认为这发生在StartManMan Sub。 terminal启动,但似乎没有任何string被传递到terminal,因为它只是rest(等待击键 – 用户可以直接与terminal交互,terminal本身是响应),Excel仍然无能为力忙于执行代码。 这个问题只发生在“KBSTRING HELLO”没有看到“HELLO”的输出时。 如果我看到“你好”,那么它总是100%的时间,完美地工作。

我已经阅读了以下关于挂起: http : //www.angelfire.com/biz/rhaminisys/ddeinfo.html#DDEslow,并意识到它可能是线程相关,但如果是这样,只是改变了我的问题(如何我是否防止/检测到这一点?)。 此外,引用的错误文章Q136218不再可用。