【问题标题】:Named pipe in VB6: CallNamedPipe() failed with error 87VB6 中的命名管道:CallNamedPipe() 失败,错误 87
【发布时间】:2011-09-01 10:33:56
【问题描述】:

我在 VB6 中使用 CallNamedPipe() 将消息发送到 C# 命名管道服务器。 在服务器端,管道由以下人员创建:

new NamedPipeServerStream(pipeName, PipeDirection.InOut, numThreads);

在客户端我使用这个调用写入 2 个字节:

  Dim Header(1) As Byte
  Header(0) = 0
  Header(1) = 6
  res = CallNamedPipe(szPipeName, Header(0), 2, bArray(0), numBytes, cbRead, 3000)

服务器看到管道已连接,因为 WaitForConnection() 确实返回,但随后无法读取任何字节。 客户端:CallNamedPipe失败,返回错误码87(参数无效?)

我的问题是:

  1. 管道创建的是字节模式还是消息模式类型?如果管道是字节模式,MSDN 说 CallNamedPipe() 失败。

  2. 有没有办法在 VB6 中写入字节模式管道。是否必须更改服务器代码才能创建消息模式管道?

  3. 如何让我的 VB6 代码工作?

【问题讨论】:

  • 好的,我现在知道要创建消息类型管道,我需要另一个带有 PipeTransmissionMode 选项的构造函数。我现在已经让 CallNamedPipe() 调用工作了。继续下一个问题。

标签: vb6 message named-pipes


【解决方案1】:

根据the documentation,当您使用该构造函数时,管道处于字节模式。我对非 .NET 管道调用了解不多,但如果 VB6 需要,我看不出有什么理由不将服务器设置为消息模式管道。

【讨论】:

  • 服务器正在以字节模式与其他一些 C++ 和 C# 客户端通信。在字节模式下,我首先将字符串的长度写入管道,然后写入字符串的正文。服务器将以这种方式解码字节流。现在我必须弄清楚消息模式是如何工作的。
  • @Charlie MSDN上的CallNamedPipe页面说相当于调用CreateFile加其他方法。 CreateFile 页面及其指向更多关于管道的页面的链接表明您可以使用 VB6 执行字节模式,但您必须自己调用更多方法(可能是 CreateFile、WriteFile 和 CloseHandle)。
  • 吉迪恩,感谢您提供的信息。我也发现了这一点,并且我正在尝试使此调用正常工作: pipeHandle = CreateFile("\\\\.\\pipe\\testpipe3", GENERIC_READ Or GENERIC_WRITE, ByVal 0, ByVal 0&, OPEN_EXISTING, 0, 0) .但它在这一行给了我“类型不匹配”错误。
  • 我犯了一个愚蠢的错字,导致 CreateFile 无法工作。我需要继续与命名管道作斗争,但我现在可以结束这个问题。谢谢@Gideon。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2020-12-20
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多