我正在使用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;
}
答案 0 :(得分:0)
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