2009-10-15 168 views
0

此代碼工作正常,可以多次調用,沒有任何問題。 但是,如果位圖調整大小(製作得更大),則會出現訪問衝突。 如果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

回答

0

可以證實,在所有 倍BMPSize & BitmapBytes陣列尺寸相符。

這是三個參數中的兩個。

+0

我可能在這裏有點厚。你指的是第三個參數?如果它是ViewFile,這將改變每個循環,因爲我正在清理(爲false)FileMappingCreated。 – user183185 2009-10-15 09:41:52

+0

「如果它是ViewFile,這將改變每個循環」 - 不,它不會。在調試器中檢查句柄。 – ima 2009-10-15 10:48:36

+0

對不起,忘了補充說,所有的變量隨着調整大小而改變,因此,Marshal.Copy中的變量也是如此。在這種情況下,它不會保持原始大小和錯誤,因爲它會超過第一次運行時設置的大小。 – user183185 2009-10-15 12:09:38

1

據我所知,位圖的大小也受顯示卡能力的限制。我們通常不會超過任何大於1024 x 1024像素的紋理/位圖大小。如果您的位圖大於此大小,則會出現一些奇怪的錯誤。

你的位圖有多大?嘗試將其切成片以逐片加載。

+0

感謝您的及時回覆。我只是將bmp從355k調整到467k,我得到了這個違規。低於355k的任何情況都可以。如果在第一次使用時,位圖是900k,那麼只要我不調整大小,一切正常。這被應用程序多次調用,並且只有在啓動時從初始大小調整爲更大的位圖時纔會失敗 – user183185 2009-10-15 09:24:23