4

コンソール アプリケーションからGetConsoleScreenBufferInfoEx関数を呼び出そうとしています。問題があれば、アプリケーションは 64 ビット Windows 7 で動作する 32 ビット アプリケーションです。言語は 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 構造体は、ここで初めて使用され、私の翻訳のどこかにエラーがあるように感じます。

4

1 に答える 1

8

CONSOLE_SCREEN_BUFFER_INFOEX送信する前に の cbSize パラメータを設定する必要があります。GetConsoleScreenBufferInfoExは正しいサイズであることを確認するため、無効なパラメータが返されます。

したがって、GetConsoleScreenBufferInfoEx追加する呼び出しの前に:

info.cbSize = 96

さらに良いことに、Real Basic では構造体のサイズにアクセスできます。

info.cbSize = GetConsoleScreenBufferInfoEx.Size

あなたのために計算を処理する必要があります。

于 2012-02-10T03:43:06.883 に答える