Ошибка GetConsoleScreenBufferInfoEx из-за неверного параметра - PullRequest
3 голосов
/ 10 февраля 2012

Я пытаюсь вызвать функцию GetConsoleScreenBufferInfoEx из консольного приложения. Если это имеет значение, это 32-битное приложение, работающее в 64-битной Windows 7. Язык - RealBasic.

Я полагаю, что я правильно определил все структуры, и дескриптор вывода буфера работает для любой другой вызываемой функции API:

  Declare Function GetConsoleScreenBufferInfoEx Lib "Kernel32" (cHandle As Integer, ByRef info As CONSOLE_SCREEN_BUFFER_INFOEX) As Boolean
  Declare Function GetLastError Lib "Kernel32" () As Integer
  Declare Function GetStdHandle Lib "Kernel32" (hIOStreamType As Integer) As Integer

  Const STD_OUTPUT_HANDLE = -11
  Dim stdHandle As Integer = GetStdHandle(STD_OUTPUT_HANDLE)

  Dim err As Integer
  Dim info As CONSOLE_SCREEN_BUFFER_INFOEX

  If GetConsoleScreenBufferInfoEx(stdHandle, info) Then
    Break
  Else
    err = GetLastError  //Always 87, Invalid parameter
    Break
  End If

Структура:

Structure CONSOLE_SCREEN_BUFFER_INFOEX
  cbSize As Integer
  dwSize As COORD
  CursorPosition As COORD
  Attribute As UInt16
  srWindow As SMALL_RECT
  MaxWindowSize As COORD
  PopupAttributes As UInt16
  FullScreenSupported As Boolean
  ColorTable(15) As UInt32


Structure COORD
  X As UInt16
  Y As UInt16


Structure SMALL_RECT
  Left As UInt16
  Top As UInt16
  Right As UInt16
  Bottom As UInt16

Я прошел через это 20 раз, и ничто не выглядит неправильно для меня. Я уже много раз использовал структуры COORD и SMALL_RECT, поэтому не думаю, что допустил в них ошибки перевода. Однако структура CONSOLE_SCREEN_BUFFER_INFOEX впервые увидела ее здесь, и я чувствую, что ошибка где-то в моем переводе.

1 Ответ

7 голосов
/ 10 февраля 2012

Вам необходимо установить параметр cbSize CONSOLE_SCREEN_BUFFER_INFOEX перед отправкой. GetConsoleScreenBufferInfoEx проверит, что это правильный размер, и поэтому возвращает неверный параметр.

Так что перед звонком на GetConsoleScreenBufferInfoEx добавьте:

info.cbSize = 96

Или, что еще лучше, Real Basic позволяет вам получить доступ к размеру структуры :

info.cbSize = GetConsoleScreenBufferInfoEx.Size

Который должен обрабатывать расчеты для вас.

...