Маршал. Метод копии бросает AccessViolationException в C#.NET

У вас есть одинарные кавычки в строке, разделенные одинарными кавычками:

'SELECT * FROM foo WHERE id = '123''

Вам нужно их избежать. IIRC, Postgres использует двойные синглы, чтобы сделать это:

'SELECT * FROM foo WHERE id = ''123'''

Или, возможно, обратный слеш:

'SELECT * FROM foo WHERE id = \'123\''
5
задан Peter O. 13 August 2014 в 21:10
поделиться

3 ответа

Это смотрит на меня как Вы, всегда пытаются скопировать число байтов myByteArray. Длина к растровому буферу.

Вы не проверяете, что растровый буфер является на самом деле столь же большим, как тот - так, вероятно, списывают конец растрового буфера.

Попытайтесь проверить если myByteArray. Длина еще больше, чем bmpData. Шаг x bmp. Высота

Если это верно, необходимо будет повторно посмотреть на предположения, которые Вы сделали со своими твердыми кодированными значениями для ширины, высоты и формата пикселя.

9
ответ дан 18 December 2019 в 12:02
поделиться

Вы не должны копировать все изображение сразу. Выделение памяти растрового объекта не могло бы быть тем, что Вы ожидаете. Например, первая строка развертки может быть сохранена в последний раз в памяти, которая означала бы, что данные для второй строки развертки закончатся вне выделенной области памяти для растрового объекта. Также там может дополнять между строками развертки для размещения их в даже адрес.

Скопируйте одну строку за один раз, с помощью bmpData. Шаг для нахождения следующей строки развертки:

int offset = 0;
long ptr = bmpData.Scan0.ToInt64();
for (int i = 0; i < Height; i++) {
   Marshal.Copy(myByteArray, offset, new IntPtr(ptr), Width * 3);
   offset += Width * 3;
   ptr += bmpData.Stride;
}
6
ответ дан 18 December 2019 в 12:02
поделиться

Ответ для меня: забыл ->

        // Unlock the bits right after Marshal.Copy
        bmp.UnlockBits(bmpData);

Кто-нибудь догадался? Речь идет о четвертой странице без ответа. Используя точный код из msdn: http://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.aspx, а именно:

                        Bitmap bmp = new Bitmap("c:\\picture.jpg");

                        // Lock the bitmap's bits.  
                        Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
                        System.Drawing.Imaging.BitmapData bmpData =
                            bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                            bmp.PixelFormat);

                        // Get the address of the first line.
                        IntPtr ptr = bmpData.Scan0;

                        // Declare an array to hold the bytes of the bitmap.
                        int bytes = bmpData.Stride * bmp.Height;
                        byte[] rgbValues = new byte[bytes];

                        // Copy the RGB values into the array.
                        //This causes read or write protected memory
                        System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

Это не работает в режиме оптимизации и работает как exe не в IDE. Любые идеи Я пытался поставить это новый проект, и если я подключаюсь к процессу, когда нажимаю кнопку, и нажимаю эту кнопку несколько раз, то происходит ошибка, но в моем коде я звоню только один раз, так или иначе, не уверен, зачем эта ошибка.

0
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: