Ce code fonctionne correctement et peut être appelé plusieurs fois sans problème. Cependant, si la bitmap est redimensionnée (agrandie), j'obtiens une violation d'accès. Ce n'est pas le cas si le bimap est réduit.Violation d'accès à la mémoire C#
Je peux confirmer que la taille de la matrice de bitmap BMPSize & BitmapBytes à tout moment.
Quelqu'un peut-il répandre la lumière sur ceci, s'il vous plaît?
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;
}
Un grand merci à tous.
PyroPaul
Je suis probablement un peu épais ici. De quel 3e paramètre parlez-vous? Si c'est ViewFile, cela changera chaque boucle pendant que j'efface (à false) FileMappingCreated. – user183185
"Si c'est ViewFile, cela va changer chaque boucle" - Non ce ne sera pas. Vérifiez les poignées dans le débogueur. – ima
Désolé, j'ai oublié d'ajouter que toutes les variables changent avec le redimensionnement et, par conséquent, les variables dans Marshal.Copy. Il ne s'agit pas, dans ce cas, de conserver la taille et les erreurs d'origine au moment où il écrase la taille définie lors de la première exécution. – user183185