У меня есть DLL, которая может генерировать изображение на основе определенного ввода. Изображение может быть экспортировано в файл или на стандартный вывод.
Я хочу создать веб-приложение, которое будет показывать это изображение, поэтому я создал обработчик, который выполняет импорт DLL и показывает изображение.
Это работает в первый раз, но потом по какой-то очень странной причине я не могу прочитать во второй раз вывод из stdout с помощью AnonymousPipeServerStream.
Код:
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, но немного. Я должен использовать точку, совместимую с (FILE *), такую как stdout, и я должен быть очень быстрым ...
И еще один вопрос (за который я боюсь за ответ):
Путем перенаправления stdout в поток канала, это только для currentThread или для всех потоков. Другими словами: если браузеры будут вызывать этот обработчик одновременно, как отреагирует система? Каждый звонок выполняется в отдельном потоке ...
Это сводит меня с ума.
С уважением,
1018 * Кристоф *