【问题标题】:Is it possible to host a webserver in VBA?是否可以在 VBA 中托管网络服务器?
【发布时间】:2023-11-14 20:37:02
【问题描述】:

我想托管一个 Web 服务器并想使用 VBA 来完成它。这可能吗?我这样做只是为了证明某人错了,并且真的想制作这个程序。

那么是否有可能制作一个非常简单的 Web 服务器(只监听 get 请求)?非常感谢您的帮助。

编辑

我正在尝试这样的事情

Sub startServer()
    Set wunsock = CreateObject("OSWINSCK.Winsock")
    wunsock.LocalPort = 80
    wunsock.Listen
End Sub

Sub wunsock_ConnectionRequest(ByVal requestID As Long)
    If sockMain.State <> sckClosed Then
        sockMain.Close
    End If
    sockMain.Accept requestID
End Sub

Private Sub wunsock_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    sockMain.GetData strData, vbString
    txtStatus.Text = txtStatus.Text & _
        strData & vbCrLf
End Sub

但它不起作用?

【问题讨论】:

  • "...证明某人错了..." --> +1
  • 嵌入在 Excel 中的 Web 服务器。令人难以置信。
  • 恕我直言,为这类事情学习 python 是值得的。它更加轻量级,并且可以在几行代码中完成。它还可以帮助您学习另一种语言的基础知识,这总是很好的。
  • 哦,我知道其他语言。我只想在办公室创建它:P

标签: vba winsock


【解决方案1】:

虽然这是一个相当老的问题,但我仍然想提一下,我使用纯 VBA 宏和一些 Winsock C 调用构建了一个 Excel 托管的 REST 网络服务器,正如 Daniel A. White 所建议的那样。

我将其添加为答案而不是评论,因为它是作为模块化库构建的,因此您可以根据需要对其进行调整,而其他人可能正是需要这种库。它可以为工作表、基本文件提供服务,还可以使用IWebController 创建自定义钩子以侦听特定路由(OP 在评论中提到):

http://github.com/michaelneu/webxcel

要使用它,您必须将类/模块导入您的工作簿,或者让构建脚本为您创建一个新的。请参阅Main.bas,了解如何从 VBA 中启动服务器。

【讨论】:

  • 我完全打算尝试这个,现在我可以对进入我的计算机的网络流量进行安全分析。在 Excel 中使用新的数据模型/PowerPivot 将非常有用。我会与我的 VBA 学生分享它:)
  • 适应 websocket 有多容易?
  • 它在路线图上,但我还没有玩过它(见github.com/michaelneu/webxcel/issues/11)。我看到的主要问题是处理并行请求,因为如果您保持 websocket 打开,您将阻止服务器接受进一步的常规 HTTP 请求(VBA 是同步的和单线程的)。我还没有弄清楚,我将如何解决这个问题,但我最近在 TCP 处理中添加了一些东西来实现 PHP 的 FastCGI(尚未合并,但它已经工作了),所以请随意使用它。跨度>
【解决方案2】:

http://www.ostrosoft.com/oswinsck.asp#inst

是一种可以从 VBA 使用的 winsock 类型的库。可以做你想做的事,尽管这不是最有效的事情。

我为你的坚韧而喝彩,希望它对你有用。

【讨论】:

  • 我正在尝试这样的 Sub startServer() Set wunsock = CreateObject("OSWINSCK.Winsock") wunsock.LocalPort = 80 wunsock.Listen End Sub Sub wunsock_ConnectionRequest(ByVal requestID As Long) If sockMain .State sckClosed Then sockMain.Close End If sockMain.Accept requestID End Sub Private Sub wunsock_DataArrival(ByVal bytesTotal As Long) Dim strData As String sockMain.GetData strData, vbString txtStatus.Text = txtStatus.Text & _ strData & vbCrLf End Sub但是它不起作用?
  • @David:请不要在评论中添加大量代码。显然难以辨认。将其作为编辑放入您的问题中,并将其格式化为code。这次我会为你做的。
【解决方案3】:

我不确定我是否完全理解这个问题。通常,您不是“托管网络服务器”,而是托管网站。

但是,如果您可以使用 VBA 进行 TCP 套接字,那么您可以通过遵循 HTTP 标准协议来制作一个非常简单的 Web 服务器。

编辑:根据您的评论,是的,只要您可以打开 TCP 套接字,您就可以制作一个简单的 Web 服务器。

【讨论】:

  • 我想监听一个网页端口上的请求(等等 localhost:234/hi.html)。它不需要回复什么的。
【解决方案4】:

好吧,冒着违反问题精神的风险,您始终可以使用 VB 对库函数的支持,只需创建一个库绑定到多个 C 语言 Web 服务器选项之一(例如 http://www.acme.com/software/micro_httpd/http://www.gnu.org/software/libmicrohttpd/http://code.google.com/p/mongoose/)。您必须从选定的 Web 服务器生成 DLL,但这很容易完成,而且在 VBA 中也可以正常工作。

【讨论】:

    【解决方案5】:

    您需要多少 VBA? These videos 演示了一个 C# 插件,用于提供静态文件和使用 Application.Run 将 REST 请求转发到 VBA 代码

    【讨论】:

      最近更新 更多