2009-10-15 3 views
0

Этот код отлично работает и может быть вызван много раз без проблем. Однако, если растровое изображение изменено (сделано больше), я получаю нарушение доступа. Это не тот случай, если бимап сделан меньше.C# Нарушение доступа к памяти

Я могу подтвердить, что размер массива BitmapBytes BMPSize & всегда имеет значение.

Может ли кто-нибудь рассказать об этом, пожалуйста?

public void SetBitmap(Bitmap bmp) 
    { 
     UInt32 BMPSize = Convert.ToUInt32(bmp.Height * bmp.Width * 4); 
     BMPSize += 0x36; 

     if (!FileMappingCreated) 
     { 
      MemoryFileHandle = CreateFileMapping((IntPtr)0, (IntPtr)0, 
       PageProtection.ReadWrite, 0, BMPSize, SharedName); 

      if (MemoryFileHandle != null) 
      { 
       SetNamedSecurityInfo(SharedName, SE_OBJECT_TYPE.SE_KERNEL_OBJECT, SECURITY_INFORMATION.DACL_SECURITY_INFORMATION, 
        IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); 


       ViewFile = MapViewOfFile(MemoryFileHandle, FILE_MAP_WRITE, 0, 0, 0); 


       if (MemoryFileHandle == IntPtr.Zero) 
       { 
        CloseHandle(MemoryFileHandle); 
       } 
       else 
       { 
        FileMappingCreated = true; 
       } 
      } 
     } 

     MemoryStream stream = new MemoryStream();   

     bmp.Save(stream, ImageFormat.Bmp); 

     byte[] BitmapBytes = stream.ToArray(); 

     // BMP SIZE Value 4bytes long see internet for DIB structure. 
     byte[] DIBImageSize = null; 
     int ImageSizeAddress = 0x22; 

     DIBImageSize = BitConverter.GetBytes(Convert.ToInt32(BMPSize)); 

     // put DIBImageSize into array starting at address 0x22 
     for (int i = 0; i < DIBImageSize.Length; i++) 
     { 
      BitmapBytes[ImageSizeAddress] = DIBImageSize[i]; 
      ImageSizeAddress++; 
     } 

     // THIS IS THE LINE THAT FAILS 
     Marshal.Copy(BitmapBytes, 0, ViewFile, Convert.ToInt32(BMPSize));   

     BitmapBytes = null; 
     DIBImageSize = null; 
     FileMappingCreated = false; 
    } 

Большое спасибо всем.

PyroPaul

ответ

0

может подтвердить, что BMPSize & BitmapBytes массив размером число на всех раз.

Это два из трех параметров.

+0

Я, вероятно, здесь немного толстый. О каком 3-м параметре вы имеете в виду? Если это ViewFile, это изменит каждый цикл, когда я очищаю (до false) FileMappingCreated. – user183185

+0

«Если это ViewFile, это изменит каждый цикл» - Нет, это не будет. Проверьте ручки в отладчике. – ima

+0

Извините, забыли добавить, что все переменные изменяются с изменением размера и, следовательно, так же делают varibles в Marshal.Copy. В этом случае он не сохраняет исходный размер и ошибки, поскольку он записывает данные за размер, который был установлен при первом запуске. – user183185

1

Как я знаю, размер растрового изображения также ограничен возможностью отображения карты. Обычно мы не превышаем размер текстуры/растрового изображения размером более 1024 х 1024 пикселей. Будут какие-то странные ошибки, если ваше растровое изображение больше этого размера.

Насколько велика ваша растровая карта? Попробуйте разрезать его на куски, чтобы загрузить его по частям.

+0

Спасибо за ваш очень быстрый ответ. Я только что изменил размер BMP с 355k до 467k, и я получил это нарушение. Все, что ниже 355k, будет в порядке. Если при первом использовании растровое изображение, скажем, 900k, то до тех пор, пока я не изменяю размер выше, все работает нормально. Это называется много раз приложением и только терпит неудачу при изменении размера до более крупного растрового изображения из начального размера при запуске – user183185

Смежные вопросы