Я пытаюсь вызвать функцию 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 впервые увидела ее здесь, и я чувствую, что ошибка где-то в моем переводе.