Этот код отлично работает и может быть вызван много раз без проблем. Однако, если растровое изображение изменено (сделано больше), я получаю нарушение доступа. Это не тот случай, если бимап сделан меньше.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
Я, вероятно, здесь немного толстый. О каком 3-м параметре вы имеете в виду? Если это ViewFile, это изменит каждый цикл, когда я очищаю (до false) FileMappingCreated. – user183185
«Если это ViewFile, это изменит каждый цикл» - Нет, это не будет. Проверьте ручки в отладчике. – ima
Извините, забыли добавить, что все переменные изменяются с изменением размера и, следовательно, так же делают varibles в Marshal.Copy. В этом случае он не сохраняет исходный размер и ошибки, поскольку он записывает данные за размер, который был установлен при первом запуске. – user183185