2011-02-24 52 views
0

當傳遞我的Devmode時調用ResetDC時出現System.AccessViolationException異常。我做了以下..調用ResetDC與devmode從編組結構複製到字節數組時崩潰

// create and marshall the devmode to a byte array. 

DEVMODE myDevmode = new DEVMODE {dmSize = (short) Marshal.SizeOf(typeof (DEVMODE))}; 

myDevmode.dmFields = DM.Orientation; 
myDevmode.dmOrientation = DMORIENT_LANDSCAPE; 

IntPtr ptDM = Marshal.AllocHGlobal(myDevmode.dmSize); 
Marshal.StructureToPtr(myDevmode, ptDM, false); 

byte[] byteDM = new byte[myDevmode.dmSize]; 
Marshal.Copy(ptDM, byteDM, 0, myDevmode.dmSize); 

然後我碰到一個COM接口調用(現有的架構無法更改)的方法:

SetDevMode(ref byteDM[0], myDevmode.dmSize) 

在COM接口和背面的另一面.NET代碼的另一側下面的運行:

public void SetDevMode(ref byte pDevMode, int nDevModeSize) 
    { 
     _pageSetupDevMode = new byte[nDevModeSize]; 

     unsafe 
     { 
      fixed (byte* p = &pDevMode) 
      { 
       Marshal.Copy((IntPtr)p, _pageSetupDevMode, 0, nDevModeSize); 
      } 
     } 
    } 

並在稍後的點到ResetDC一個呼叫是由:

Win32.ResetDC(_hRefDc, ref _pageSetupDevMode[0]); 

在這一點上我得到了異常。

發生類型'System.AccessViolationException'的未處理異常 附加信息:試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。

這occurrs gdi32.dll裏面

任何想法?

+0

道歉,看起來像我的錯誤是在使用一個不兼容的devmode不是我的編組。 – Trev 2011-02-24 15:14:27

回答

1

正如在上面的評論中所提到的,這不是內存處理的問題,而是將幾乎空的devmode傳遞到ResetDC的結果 - 我曾在網上看過一個樣本,但似乎「不高興」 gdi打印時。

我現在正在從打印機得到一個有效的devmode作爲上面的代碼的基礎,這工作正常。道歉。