【问题标题】:Crash on calling ResetDC with devmode copied to byte array from marshalled structure使用从编组结构复制到字节数组的 devmode 调用 ResetDC 时崩溃
【发布时间】: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


【解决方案1】:

正如上面评论中提到的,这不是内存处理的问题,而是将一个几乎为空的 devmode 传递给 ResetDC 的结果——我在网上的一个示例中看到了这一点,但它似乎“扰乱”了 gdi打印时。

我现在从打印机获得一个有效的开发模式作为上述代码的基础,这工作正常。道歉。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多