下記のコードでリモートの準備ができていない時に、
起動させて何もしないで待っていると40秒後位にWinsock1_Errorが検出されます。
しかし、起動後にCommand2をクリックしてメッセージボックスを1分位表示させた後に、
メッセージボックスを消しても、Winsock1_Errorは検出されないで、
いつまで経ってもWinsock1.State=6(接続処理中)のままです。
Winsock1_Errorイベント以外にもエラー処理は必要でしょうか?
また、必要だとすればどの様なエラー処理を行なえば良いでしょうか?
よろしくお願いします。
' Form1
Option Explicit
Private Sub Form_Load()
Winsock1.Protocol = sckTCPProtocol
Winsock1.RemoteHost = "192.168.1.1"
Winsock1.RemotePort = 8192
Winsock1.LocalPort = 0
Winsock1.Connect
End Sub
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "WinsockエラーNo. = " & Number & vbCrLf & Description & vbCrLf & "終了します。"
Unload Me
End Sub
Private Sub Command2_Click()
MsgBox Winsock1.State
End Sub
Errorイベント内に以下の処理を追加したらどうでしょう…
If Winsock1.State <> sckClosed Then
Winsock1.Close '切断
End If
もちろん、 Form_Unload時には、ソケットをCloseしないといけないですね
悠さん返答ありがとうございます。
上記追加しましたが、状況は変化しませんでした。
Errorイベントは発生しているが、
メッセージボックスを表示している時には、
Errorイベントを取り逃がしている様な感じがします。
どうしてかというと、フォーム起動後にCommand2でメッセージボックスを表示させて、
さらに時計を表示させているとフォーム起動後40秒後位に時計が一瞬とまるからです。
Errorイベントはこんな仕様なのでしょうか?
あー、取り逃がしてるかもしれませんね。MSCOMMのイベントもmsgbox開いてたら来ませんし。まあ、バッチ(オンラインに対する意)処理ではmsgboxは使わないのが無難だと思いますが。ユーザに知らせる必要があればステータスバー、無ければログ、というところでしょうかね。
やまごろさん返答ありがとうございます。
msgbox起動中にはErrorイベントを取り逃がすみたいなので、
それを考慮して作成したいと思います。
ツイート | ![]() |