vba VisualBasic 中的 MSWinsock.Winsock 事件处理

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/125921/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 09:21:20  来源:igfitidea点击:

MSWinsock.Winsock event handling in VisualBasic

eventsexcel-vbawinsockvbaexcel

提问by user21530

I'm trying to handle Winsock_Connect event (Actually I need it in Excel macro) using the following code:

我正在尝试使用以下代码处理 Winsock_Connect 事件(实际上我在 Excel 宏中需要它):

Dim Winsock1 As Winsock 'Object type definition

Sub Init()
    Set Winsock1 = CreateObject("MSWinsock.Winsock") 'Object initialization
    Winsock1.RemoteHost = "MyHost"
    Winsock1.RemotePort = "22"
    Winsock1.Connect

    Do While (Winsock1.State <> sckConnected)
        Sleep 200
    Loop
End Sub

'Callback handler
Private Sub Winsock1_Connect()
    MsgBox "Winsock1::Connect"
End Sub

But it never goes to Winsock1_Connect subroutine although Winsock1.State is "Connected". I want to use standard MS library because I don't have administrative rights on my PC and I'm not able to register some custom libraries. Can anybody tell me, where I'm wrong?

但它永远不会进入 Winsock1_Connect 子例程,尽管 Winsock1.State 是“已连接”。我想使用标准的 MS 库,因为我在我的 PC 上没有管理权限,而且我无法注册一些自定义库。谁能告诉我,我错在哪里?

采纳答案by Nescio

Are you stuck using MSWinsock?
Hereis a site/tutorial using a custom winsock object.

您是否一直在使用 MSWinsock?
是一个使用自定义 winsock 对象的站点/教程。

Also... You need to declare Winsock1 WithEventswithin a "Class" module:

另外...您需要在“类”模块中声明 Winsock1 WithEvents

Private WithEvents Winsock1 As Winsock

And finally, make sure you reference the winsock ocx control.
Tools -> References -> Browse -> %SYSEM%\MSWINSCK.OCX

最后,确保您引用了 winsock ocx 控件。
工具 -> 参考 -> 浏览 -> %SYSEM%\MSWINSCK.OCX

回答by befzz

Documentation about Winsock Control:
http://msdn.microsoft.com/en-us/library/aa228119%28v=vs.60%29.aspx
Example here:
http://support.microsoft.com/kb/163999/en-us

关于Winsock 控件的文档:
http: //msdn.microsoft.com/en-us/library/aa228119%28v=vs.60%29.aspx
此处示例:http:
//support.microsoft.com/kb/163999/en -我们

My short example with event handling in VBscript:

我在 VBscript 中使用事件处理的简短示例:

Dim sock
Set sock = WScript.CreateObject("MSWinsock.Winsock","sock_")
sock.RemoteHost = "www.yandex.com"
sock.RemotePort = "80"
sock.Connect

Dim received
received = 0

Sub sock_Connect()
    WScript.Echo "[sock] Connection Successful!"
    sock.SendData "GET / HTTP/1.1"& vbCrLf & "Host: " & sock.RemoteHost  & vbCrLf & vbCrLf
End Sub

Sub sock_Close()
    WScript.Echo "[sock] Connection closed!"
End Sub

Sub sock_DataArrival(Byval b)
    Dim data
    sock.GetData data, vbString
    received = received + b
    WScript.Echo "---------------------------------------"
    WScript.Echo " Bytes received: " & b  & " ( Total: " & received & " )"
    WScript.Echo "---------------------------------------"
    WScript.Echo data
End Sub

'Wait for server close connection
Do While sock.State <> 8
    rem WScript.Echo sock.State
    WScript.Sleep 1000
Loop

Output will be:

输出将是:

cscript /nologo sockhttp.vbs

cscript /nologo sockhttp.vbs

[sock] Connection Successful!
-------------------------------
 Bytes received: 1376 ( Total: 1376 )
-------------------------------
HTTP/1.1 200 Ok
Date: Mon, 08 Dec 2014 15:41:36 GMT
Content-Type: text/html; charset=UTF-8
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Expires: Mon, 08 Dec 2014 15:41:36 GMT
...