win32 GetConsoleMode()错误代码6

致命死亡

我正在从另一篇文章中跟踪该示例,请从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})

main.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 Studio12。在某个目录中调用它们。我收到“无法获取控制台模式6”,这意味着GetLastError()返回6。

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

编辑:看来这仅在从命令行运行时失败。在Visual Studio调试器的Visual Studio中,它可以成功。仍然对Visual Studio缺乏足够的知识来确定发生了什么。我只想制作一个可以从命令行运行并隐藏其输入的简单exe。

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

Ben

错误6的意思是“无效的句柄”,并且意味着您传递给的句柄GetConsoleMode不是控制台句柄。即STDIN已从某个地方重定向。

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

例子:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

win32 GetConsoleMode()错误代码6

来自分类Dev

Python Win32:错误

来自分类Dev

C ++,Win32错误

来自分类Dev

Win32错误代码122在这种情况下是否有些良性?

来自分类Dev

Win32错误代码称为大写的文本标识符,在给定错误代码的情况下如何以编程方式确定它们?

来自分类Dev

VS代码未定义_WIN32

来自分类Dev

在Win32应用程序中连续运行代码

来自分类Dev

程序集Win32 _printf代码崩溃

来自分类Dev

如何从托管代码使用win32'IOpenControlPanel'接口?

来自分类Dev

PRINTER_INFO_6无法使用WIn32 API

来自分类Dev

如何处理Win32错误消息的占位符?

来自分类Dev

Unity Android构建错误WIN32异常ZipAlign

来自分类Dev

OPENCV链接错误-Win32和VS2012

来自分类Dev

Win32 :: Job产生错误,使用严格

来自分类Dev

py2exe和Win32 OLEObject错误

来自分类Dev

Visual Studio:“不是 Win32 应用程序”错误

来自分类Dev

我如何在我的 win32 读取图像文件代码中解决这个错误

来自分类Dev

为Win32编译的Win64 SSE代码产生错误的性能计数器结果

来自分类Dev

Eclipse验证错误-平台过滤器不匹配:(&(osgi.ws = win32)(osgi.os = win32)(osgi.arch = x86))

来自分类Dev

SSH错误。安装服务时出错:CreateService:Win32错误1057

来自分类Dev

(C ++)使用g ++返回“对WinMain @ 16的未定义引用”的Win32 API示例代码

来自分类Dev

Visual C++ Win32 api代码拦截某个击键

来自分类Dev

Python win32 ShellExecute错误31:“连接到系统的设备无法运行。”

来自分类Dev

Application.exe不是有效的Win32应用程序错误

来自分类Dev

Windows 10中的Win32工具提示灰线错误

来自分类Dev

传递给Icon的Win32句柄无效或类型错误

来自分类Dev

我是否有Microsoft资源来翻译Windows Winapi / Win32 / system错误消息?

来自分类Dev

使用MSVC在Win32上构建QtWebKit的链接器错误

来自分类Dev

Win32应用程序中Visual Studio中的LNK2019错误?

Related 相关文章

  1. 1

    win32 GetConsoleMode()错误代码6

  2. 2

    Python Win32:错误

  3. 3

    C ++,Win32错误

  4. 4

    Win32错误代码122在这种情况下是否有些良性?

  5. 5

    Win32错误代码称为大写的文本标识符,在给定错误代码的情况下如何以编程方式确定它们?

  6. 6

    VS代码未定义_WIN32

  7. 7

    在Win32应用程序中连续运行代码

  8. 8

    程序集Win32 _printf代码崩溃

  9. 9

    如何从托管代码使用win32'IOpenControlPanel'接口?

  10. 10

    PRINTER_INFO_6无法使用WIn32 API

  11. 11

    如何处理Win32错误消息的占位符?

  12. 12

    Unity Android构建错误WIN32异常ZipAlign

  13. 13

    OPENCV链接错误-Win32和VS2012

  14. 14

    Win32 :: Job产生错误,使用严格

  15. 15

    py2exe和Win32 OLEObject错误

  16. 16

    Visual Studio:“不是 Win32 应用程序”错误

  17. 17

    我如何在我的 win32 读取图像文件代码中解决这个错误

  18. 18

    为Win32编译的Win64 SSE代码产生错误的性能计数器结果

  19. 19

    Eclipse验证错误-平台过滤器不匹配:(&(osgi.ws = win32)(osgi.os = win32)(osgi.arch = x86))

  20. 20

    SSH错误。安装服务时出错:CreateService:Win32错误1057

  21. 21

    (C ++)使用g ++返回“对WinMain @ 16的未定义引用”的Win32 API示例代码

  22. 22

    Visual C++ Win32 api代码拦截某个击键

  23. 23

    Python win32 ShellExecute错误31:“连接到系统的设备无法运行。”

  24. 24

    Application.exe不是有效的Win32应用程序错误

  25. 25

    Windows 10中的Win32工具提示灰线错误

  26. 26

    传递给Icon的Win32句柄无效或类型错误

  27. 27

    我是否有Microsoft资源来翻译Windows Winapi / Win32 / system错误消息?

  28. 28

    使用MSVC在Win32上构建QtWebKit的链接器错误

  29. 29

    Win32应用程序中Visual Studio中的LNK2019错误?

热门标签

归档