此代碼工作正常,可以多次調用,沒有任何問題。 但是,如果位圖調整大小(製作得更大),則會出現訪問衝突。 如果bimap變小,情況就不是這樣。C#內存訪問衝突
我可以一直確認BMPSize & BitmapBytes數組大小。
任何人都可以在此傳播任何光線嗎?
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
我可能在這裏有點厚。你指的是第三個參數?如果它是ViewFile,這將改變每個循環,因爲我正在清理(爲false)FileMappingCreated。 – user183185 2009-10-15 09:41:52
「如果它是ViewFile,這將改變每個循環」 - 不,它不會。在調試器中檢查句柄。 – ima 2009-10-15 10:48:36
對不起,忘了補充說,所有的變量隨着調整大小而改變,因此,Marshal.Copy中的變量也是如此。在這種情況下,它不會保持原始大小和錯誤,因爲它會超過第一次運行時設置的大小。 – user183185 2009-10-15 12:09:38