suleymankenar Ответов: 1

Попытка чтения или записи защищенной памяти


Привет,
В этом коде я " попытался прочитать или записать защищенную память.Это часто указывает на то, что другая память повреждена"

Небезопасный кодек находится внутри StreamLibrary.dll ссылочная библиотека dll c# включает в себя неуправляемые коды.Который я скачал с github и скомпилировал.https://github.com/AnguisCaptor/StreamLibrary[^]

И это мой код
Dim unsafeCodec As IUnsafeCodec = New UnsafeStreamCodec(80)
       Dim stream As New MemoryStream(10000000)
       Try
           While streamDesktop And client.Connected
               Dim bmp As Bitmap = CaptureDesktop()
               Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
               Dim size As Size = New System.Drawing.Size(bmp.Width, bmp.Height)
               Dim bmpData As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat)
               unsafeCodec.CodeImage(bmpData.Scan0, rect, size, bmp.PixelFormat, stream)'Error at this line
               If stream.Length > 0 Then
                   MsgBox(stream.ToArray.Length)
                   Send("Desktop|", , stream.ToArray)
               End If
               bmp.UnlockBits(bmpData)
               bmp.Dispose()
           End While
       Catch ex As Exception
           MsgBox(ex.Message)
       End Try


Как я могу это исправить ? Спасибо

Sergey Alexandrovich Kryukov

В каком направлении?
—СА

suleymankenar

Извините забыл написать это он дает в этой строке
unsafeCodec.CodeImage(bmpData.Scan0, прямоугольник, площадь, БМП.PixelFormat, трансляция)

Sergey Alexandrovich Kryukov

Хорошо, но, к сожалению, я могу только догадываться, что делает unsafeCodec и как он работает... вероятно, он делает что-то слишком небезопасное... :-)
—СА

Duncan Edwards Jones

Вы передаете bmpData. Scan0 по значению, а не по ссылке? (то есть адрес, хранящийся в Scan0, а не адрес переменной Scan0)?

1 Ответов

Рейтинг:
0

Valery Possoz

Привет,

Это потому, что вы не используете stream и bitmpa должным образом, после нескольких итераций вы получите это исключение, потому что у вас есть утечка памяти.

MemoryStream реализует

IDisposable
и это хорошая практика, чтобы избавиться от него, когда вы закончили его использовать. Один простой способ сделать это-использовать
using


То, что я сделал бы в первую очередь, - это немного рефакторинг, чтобы устранить утечки:

Dim unsafeCodec As IUnsafeCodec = New UnsafeStreamCodec(80)
Try
    While streamDesktop And client.Connected
        Using bmp As Bitmap = CaptureDesktop()
            Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
            Dim size As Size = New System.Drawing.Size(bmp.Width, bmp.Height)
            Dim bmpData As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat)
            Using stream As New MemoryStream()
                unsafeCodec.CodeImage(bmpData.Scan0, rect, size, bmp.PixelFormat, stream) 'no more error here.
                If stream.Length > 0 Then
                    MsgBox(stream.ToArray.Length)
                    Send("Desktop|", , stream.ToArray)
                End If
                bmp.UnlockBits(bmpData)
            End Using
        End Using
    End While
Catch ex As Exception
    MsgBox(ex.Message)
End Try


Валери