1

問題の性質:

ManMan データベース システム、Minisoft の端末アプリケーションとの DDE 接続と会話を正常に確立するマクロを有効にした Excel シートがあります。DDE は約 95% の時間で正常に動作しますが、Excel と Minisoft の間でデータが交換されていないように見えることがあります (~5%)。これが発生すると、Minisoft シェルは、データがクラッシュするか、ユーザーがイライラして Excel プロセスを終了するまで、基本的にシートをロックするのを待ってハングします。この会話のハングは、シェルが開かれた後の会話の開始時にのみ発生し、ランダムに発生するようです (シートの VBA を 3 回実行してハングするか、50 回実行してもハングしない)。DDE のハングが発生すると、マシンを再起動するか、ログアウトしてウィンドウに再度ログインするまで、次の実行試行ごとに (Excel/Minisoft を閉じて再度開いても) ハングしますが、他に何も解決しないようです。誰かがこの問題の原因について何か洞察を持っている場合は、私に知らせてください. それを防ぐか、このハングがいつ発生するかを検出できるようにする必要があります。

コードと追加情報:

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 は利用できなくなりました。

4

0 に答える 0