编组访问违规

时间:2010-08-25 13:41:31

标签: .net pinvoke access-violation

正确的函数声明是:

[DllImport("user32.dll")]
static extern int SetScrollInfo (IntPtr hwnd, int n, ref SCROLLINFO lpcScrollInfo, bool b);

我宣称它是:

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
static extern int SetScrollInfo (IntPtr hwnd, int n, SCROLLINFO lpcScrollInfo, bool b);

这可能是访问冲突异常的原因吗?

这是我得到的例外:

  

UI线程中出现未处理的异常   System.AccessViolationException:尝试读取或写入受保护的   记忆。这通常表明其他记忆已损坏   在System.Drawing.SafeNativeMethods.PrintDlg(PRINTDLGX86 lppd)at at   System.Drawing.Printing.PrinterSettings.GetDefaultPrinterName()at   System.Drawing.Printing.PrinterSettings.get_PrinterNameInternal()
  在System.Drawing.Printing.PrinterSettings.get_PrinterName()

2 个答案:

答案 0 :(得分:0)

您没有发布SCROLLINFO结构定义。在您发布的代码中,我看到bool参数类型不正确:将其定义为int。 Win32 BOOL是32位值,它与.NET中的int匹配。

发布完整代码:PInvoke定义并调用SetScrollInfo以获取更多信息。

答案 1 :(得分:0)

结构声明:

   [StructLayout(LayoutKind.Sequential)]
    public class SCROLLINFO
    {
        public int cbSize;
        public int fMask;
        public int nMin;
        public int nMax;
        public int nPage;
        public int nPos;
        public int nTrackPos;
        public SCROLLINFO()
        {
            cbSize = Marshal.SizeOf(typeof(SCROLLINFO));
        }
        public SCROLLINFO(int mask, int min, int max, int page, int pos)
        {
            cbSize = Marshal.SizeOf(typeof(SCROLLINFO));
            fMask = mask;
            nMin = min;
            nMax = max;
            nPage = page;
            nPos = pos;
        }
    }

调用:             SCROLLINFO scrollinfo1 = new SCROLLINFO();             SetScrollInfo(new HandleRef(this,Handle),0,scrollinfo1,true);