Обнаружен дисбаланс стека Pinvoke - PullRequest
0 голосов
/ 19 октября 2011

У меня есть следующая функция:

[DllImport("user32.dll", CharSet=CharSet.Auto)]
static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, SPoint lParam);

Он продолжает жаловаться на дисбаланс стека Pinvoke, когда выполняется следующий код:

SendMessage(EventRichTextBox.Handle, EM_GETSCROLLPOS, 0, OldScrollPoint);

Что может вызвать эту проблему?

это мой SPoint

  private struct SPoint
    {
        public Int32 x;
        public Int32 y;
    }

и

SPoint OldScrollPoint = default(SPoint);

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Не могу сказать наверняка, но одна очевидная возможность состоит в том, что вы работаете на 64-битной машине, а int неправильный тип для wParam.Это должно быть 64-битное значение в 64-битном процессе.

Мы также не знаем, как вы объявили SPoint.Вы должны передать указатель на структуру POINT.Это не выглядит так, как будто вы сделали это.

Правильная подпись:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(
    IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

Ваше редактирование разъясняет, что SPoint является структурой.Это тогда явно неправильно.Вы можете просто передать SPoint как параметр out.Это было бы самое простое решение.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(
    IntPtr hWnd, int Msg, IntPtr wParam, out SPoint lParam);

Если вам нужна более общая SendMessage подпись, тогда вы должны использовать IntPtr, как я говорил выше, и использовать Marshal.StructureToPtr.

1 голос
/ 19 октября 2011

Аргумент wParam должен быть IntPtr. Но это не то, что вызывает MDA, ложь о типе аргумента - это хорошо, но вы должны делать это правильно. Структуры передаются по ссылке в API Windows, объявите аргумент lParam как ref SPoint. Или out, если структура возвращается, случай для EM_GETSCROLLPOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...