gpt4 book ai didi

c++ - win32 GetConsoleMode() 错误代码 6

转载 作者:行者123 更新时间:2023-11-30 01:46:17 36 4
gpt4 key购买 nike

我正在关注此处另一篇文章中的示例 Reading a password from std::cin在您捕获标准输入句柄的地方,获取当前控制台模式,更改模式以抑制输入回显。出于某种原因,当我调用 GetStdHandle() 时它返回一个有效句柄,但是当我调用 GetConsoleMode() 时它失败并返回错误代码 6。我在 cmake 项目中使用它。我应该设置任何调试标志以使其按预期工作吗?还有其他人遇到过这个吗?

void set_stdin_echo(bool enable) {
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE) {
std::cout << "invalid handle " << GetLastError() << std::endl;
return;
}
else if (hStdin == NULL) {
std::cout << "no handle associated" << std::endl;
return;
}

DWORD mode = 0;
if (GetConsoleMode(hStdin, &mode) == 0) {
std::cout << "Could not get console mode" << GetLastError() << std::endl;
}

std::cout << mode << std::endl;
if (!enable)
mode &= ~ENABLE_ECHO_INPUT;
else
mode |= ENABLE_ECHO_INPUT;
std::cout << mode << std::endl;

if (SetConsoleMode(hStdin, mode) == 0) {
std::cout << "Could not set input mode" << std::endl;
std::cout << GetLastError() << std::endl;
}
}

编辑:使用此代码复制。

CMakeLists.txt

cmake_minimum_required (VERSION 2.6)
project(tester)

if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "-g -w -Wall -pedantic-errors -std=c++11")
elseif(MSVC)
set(CMAKE_CXX_FLAGS "/EHsc")
set(CMAKE_CXX_FLAGS_DEBUG "/EHsc /MTd")
set(CMAKE_CXX_FLAGS_RELEASE "/EHsc /MT")
endif()

set(SOURCE_FILES "main.cpp")

add_executable(tester ${SOURCE_FILES})

主要.cpp

#include <iostream>
#include <string>
#include <windows.h>

void set_stdin_echo(bool enable) {
DWORD error;
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
error = GetLastError();
if (hStdin == INVALID_HANDLE_VALUE) {
std::cout << "invalid handle " << error << std::endl;
return;
}
else if (hStdin == NULL) {
std::cout << "no handle associated" << std::endl;
return;
}

DWORD mode = 0;
if (GetConsoleMode(hStdin, &mode) == 0) {
error = GetLastError();
std::cout << "Could not get console mode" << error << std::endl;
}

std::cout << mode << std::endl;
if (!enable)
mode &= ~ENABLE_ECHO_INPUT;
else
mode |= ENABLE_ECHO_INPUT;
std::cout << mode << std::endl;

if (SetConsoleMode(hStdin, mode) == 0) {
error = GetLastError();
std::cout << "Could not set input mode" << std::endl;
std::cout << error << std::endl;
}
}

int main() {
std::string input;
std::cout << "password: ";
set_stdin_echo(false);
std::cin >> input;
set_stdin_echo(true);

return 0;
}

Visual Studio 12。在某个目录中调用这些。我得到“无法获得控制台模式 6”,这意味着 GetLastError() 返回 6。

mkdir build
cmake ..
msbuild.exe tester.sln
./Debug/tester.exe

编辑:这似乎只有在从命令行运行时才会失败。在 visual studio 调试器的 visual studio 中,它成功了。仍然没有足够的 visual studio 知识来确定发生了什么。我只想制作一个可以从命令行运行并隐藏其输入的简单 exe。

编辑:清洁并在调用后尽快获取 GetLastError。仍然没有变化。

最佳答案

此错误 6 表示“无效句柄”,表示您传递给 GetConsoleMode 的句柄不是控制台句柄。 IE。 STDIN 已从某处重定向。

为了确保您拥有当前控制台的句柄,无论 STDIN 是否从其他地方重定向,请使用带有特殊名称 "CONIN$"CreateFile,它打开控制台(如果存在)。

例子:

HANDLE hConsole = CreateFile("CONIN$",  
GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

关于c++ - win32 GetConsoleMode() 错误代码 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33476316/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com