Go 与 Python 和其他语言中 Windows 上命名管道的行为

问题描述 投票:0回答:1

我正在尝试使用 Soundpad 的 API,它通过命名管道公开。 在Python中,调用API就像

一样简单
import win32file

handle = win32file.CreateFile(
    r'\\.\pipe\sp_remote_control',
    win32file.GENERIC_READ | win32file.GENERIC_WRITE,
    0,
    None,
    win32file.OPEN_EXISTING,
    0,
    None
)

win32file.WriteFile(handle, str.encode("DoPlaySound(2)"))

API 的细节对于这个问题并不重要。我想知道的是上面的 Python 代码和下面的 Go 代码之间的区别:

import (
    "bufio"
    "log"
    "net/http"

    "github.com/Microsoft/go-winio"
)

func main() {
    conn, err := winio.DialPipe(`\\.\pipe\sp_remote_control`, nil)

    if err != nil {
        log.Fatal(err)
    }

    writer := bufio.NewWriter(conn)

    _, err = writer.WriteString("DoPlaySound(2)")
}

与命名管道的连接已建立,14 个字节写入成功,但 Soundpad 由于某种原因似乎没有收到消息。 我已经研究过编码的差异,但 Go 将所有字符串编码为 UTF-8,与 Python 3 相同。 我也尝试过使用

writer.Write(([]byte)("DoPlaySound(2)"))
得到相同的结果。

对我来说,这两个例子看起来完全一样,所以我希望有人能指出其中的区别,也许可以帮助我找出 Go 版本不起作用的原因。

go winapi named-pipes
1个回答
0
投票

应该只是你最后一行的问题

_, err = writer.WriteString("DoPlaySound(2)")

成为

if _, err = writer.WriteString("DoPlaySound(2)"); err==nil {
    err=writer.Flush()
}

需要写入管道的内容仍在 bufio.Writer 缓冲区中,需要刷新

© www.soinside.com 2019 - 2024. All rights reserved.