VB6中的命名管道:CallNamedPipe()失败,错误为87

VB6中的命名管道:CallNamedPipe()失败,错误为87,vb6,message,named-pipes,Vb6,Message,Named Pipes,我在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),

我在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(参数无效?)

我的问题是:

  • 创建的管道是字节模式还是消息模式类型?MSDN表示,如果管道为字节模式,则CallNamedPipe()将失败

  • 在VB6中是否有写入字节模式管道的方法。我是否必须更改服务器代码才能创建消息模式管道

  • 如何让我的VB6代码工作


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

    Ok,我现在知道,要创建消息类型管道,我需要另一个带有PipeTransmissionMode选项的构造函数。我现在已使CallNamedPipe()调用正常工作。接着讨论下一个问题。服务器正在用字节模式与其他几个C++和C客户端进行对话。在字节模式下,我首先将字符串的长度写入管道,然后写入字符串的主体。服务器将以这种方式解码字节流。现在我必须弄清楚消息模式是如何工作的。@Charlie MSDN上的
    CallNamedPipe
    页面说,它相当于调用
    CreateFile
    以及其他方法。CreateFile页面及其指向“关于管道的更多信息”页面的链接建议您可以使用VB6执行字节模式,但您必须自己调用更多方法(可能是CreateFile、WriteFile和CloseHandle)。Gideon,感谢您提供的信息。我也发现了这一点,我正在尝试让这个调用工作:pipeHandle=CreateFile(“\\\\\.\\pipe\\testpipe3”),GENERIC\u READ或GENERIC\u WRITE,ByVal 0,ByVal 0&,OPEN\u EXISTING,0,0)。但这一行给了我“类型不匹配”的错误。我犯了一个愚蠢的错误,导致CreateFile无法工作。我需要继续与命名管道进行斗争,但我现在可以结束这个问题。谢谢你,吉迪恩。