我有一个可以根据某个输入生成图像的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或所有线程。换句话说:如果浏览器在同一时间调用此处理程序,系统将如何反应?每个调用都在一个单独的线程中执行......
这让我发疯了。
此致
克里斯托夫