在Win32中获取SetConsoleCursorPosition函数调用的Errorno 87(无效参数)

时间:2017-09-30 12:07:06

标签: c++ winapi

我正在使用Win32和Tiny C编译器在C中编写控制台应用程序。 环境是Windows 8.1 64位。 当我调用SetConsoleCursorPosition函数时,我得到一个Errorno 87(无效参数)。 示例代码如下。

 #include <windows.h>
    #include <conio.h>
    #include <stdio.h>
    COORD coord ;
    main()
    {

    int res ;
    HANDLE h ;
    char teststr[100];
    h = GetStdHandle(STD_OUTPUT_HANDLE);
    if(h ==INVALID_HANDLE_VALUE)
    return ;
    coord.X= 10;
    coord.Y = 10;
    res = SetConsoleCursorPosition(h,coord);
    if(!res)
    {
    sprintf(teststr," res= %d ; Coords : %d %d ",GetLastError(), coord.X,   coord.Y);
    cprintf(teststr);
    }
getch();
return;
}

1 个答案:

答案 0 :(得分:0)

当且仅当 dwCursorPosition 无效时,

https://github.com/pypa/pip/issues/2345返回ERROR_INVALID_PARAMETER - 坐标必须位于控制台屏幕缓冲区的边界内。更确切地说 - 需要致电SetConsoleCursorPosition dwCursorPosition 必须在GetConsoleScreenBufferInfo dwSize 成员的范围内

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

switch ((ULONG_PTR)hStdOut)
{
case NULL:
case INVALID_HANDLE_VALUE:
    break;
default:
    CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
    if (GetConsoleScreenBufferInfo(hStdOut, &ConsoleScreenBufferInfo))
    {
        COORD dwCursorPosition = { 10, 10};
        if ((USHORT)dwCursorPosition.X < (USHORT)ConsoleScreenBufferInfo.dwSize.X &&
            (USHORT)dwCursorPosition.Y < (USHORT)ConsoleScreenBufferInfo.dwSize.Y)
        {
            if (!SetConsoleCursorPosition(hStdOut, dwCursorPosition))
            {
                DbgPrint("SetConsoleCursorPosition - %u\n", GetLastError());
            }
        }
        else
        {
            // will be be ERROR_INVALID_PARAMETER
        }
    }
    else
    {
        DbgPrint("GetConsoleScreenBufferInfo - %u\n", GetLastError());
    }
}

如果无效或不是控制台(管道,文件,空设备)句柄( hStdOut ) - 将ERROR_INVALID_HANDLE错误。

对于研究此错误,您首先必须获得CONSOLE_SCREEN_BUFFER_INFO,并确保您的坐标有效。如果是,您需要在调用SetConsoleCursorPosition之前查看 edx 寄存器的调试器值 - 它必须是0x000A000A - 如果不是,请粘贴asm代码,编译器如何生成初始化<调用SetConsoleCursorPosition

之前,em> edx (或 rdx 但会忽略高位部分)