【发布时间】:2011-07-03 10:47:04
【问题描述】:
通过我的 Devmode 时,我在调用 ResetDC 时收到 System.AccessViolationException。我正在做以下事情..
// 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”类型的未处理异常 附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。
这发生在 gdi32.dll 中
有什么想法吗?
【问题讨论】:
-
抱歉,看来我的错误在于使用了不兼容的开发模式而不是我的编组。
标签: .net interop struct marshalling gdi