将stdout从DLL传输到webclient

时间:2011-10-08 17:54:21

标签: asp.net c++ redirect native stdout

我有一个可以根据某个输入生成图像的DLL。图像可以导出到文件或标准输出。 我想创建一个将显示此图像的Web应用程序,因此我创建了一个执行DLL导入的处理程序,以显示该图像。 这是第一次使用,但是出于一些非常奇怪的原因,我无法使用AnonymousPipeServerStream第二次读取stdout的输出。

代码:

Dim oContext As HttpContext = CType(oOBject, HttpContext)
Dim iLength As Integer = 0

Using oServer As New IO.Pipes.AnonymousPipeServerStream(IO.Pipes.PipeDirection.Out, IO.HandleInheritability.None, 6562038)
    Dim defaultHandle As IntPtr = GetStdHandle(STD_OUTPUT_HANDLE)
    SetStdHandle(STD_OUTPUT_HANDLE, CType(oServer.SafePipeHandle.DangerousGetHandle, IntPtr))
    Dim x = Err.LastDllError
    Try
        Dim i As Integer = fnImageConverter() 'THIS IS THE DLL FUNCTION WHICH WRITES TO STDOUT
    Catch ex As Exception

    End Try

    Using oClient As New IO.Pipes.AnonymousPipeClientStream(IO.Pipes.PipeDirection.In, oServer.ClientSafePipeHandle)
        Using oReader As New IO.BinaryReader(oClient)
            oServer.Flush()
            While (iLength < 6562038) 'TODO, size to read.

                Dim aValue As Byte = oReader.ReadByte()
                oContext.Response.OutputStream.WriteByte(aValue)
                iLength += 1
            End While
        End Using
    End Using
    SetStdHandle(STD_OUTPUT_HANDLE, defaultHandle)
    x = Err.LastDllError

    oServer.DisposeLocalCopyOfClientHandle()
    oServer.Close()
End Using

这是第一次完美。第二次(例如,当客户端点击刷新按钮时)它会挂起“oReader.ReadByte()”后面的本机代码。

我希望有人可以帮助我。我真的很长一段时间,找不到正确的溶剂。 我可以稍微修改DLL。我必须使用与(文件*)兼容的点,如stdout,我必须非常快......

还有一些其他问题(我害怕答案): 通过将stdout重定向到管道流,这仅适用于currentThread或所有线程。换句话说:如果浏览器在同一时间调用此处理程序,系统将如何反应?每个调用都在一个单独的线程中执行......

这让我发疯了。

此致

克里斯托夫

0 个答案:

没有答案