Нарушение прав доступа при маршалинге - PullRequest
0 голосов
/ 25 августа 2010

Правильное объявление функции:

[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);

Может ли это быть причиной исключения нарушения прав доступа?

Это исключение, которое я получаю:

Произошло необработанное исключение в потоке пользовательского интерфейса System.AccessViolationException: попытка чтения или записи защищена объем памяти. Это часто указывает на то, что другая память повреждена.
в System.Drawing.SafeNativeMethods.PrintDlg (PRINTDLGX86 lppd) в System.Drawing.Printing.PrinterSettings.GetDefaultPrinterName () в System.Drawing.Printing.PrinterSettings.get_PrinterNameInternal ()
в System.Drawing.Printing.PrinterSettings.get_PrinterName ()

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

объявление структуры:

   [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 = новый SCROLLINFO (); SetScrollInfo (новый HandleRef (this, Handle), 0, scrollinfo1, true);

0 голосов
/ 25 августа 2010

Вы не опубликовали определение структуры SCROLLINFO. В коде, который вы разместили, я вижу, что тип параметра bool неверен: определите его как int. Win32 BOOL - это 32-битное значение, оно соответствует int в .NET.

Разместите полный код: вызовите определения PInvoke и вызовите SetScrollInfo для получения дополнительной информации.

...