c - 使用第二个参数的 ReadConsoleOutputCharacter 错误

标签 c winapi

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684969(v=vs.85).aspx 错误 C2664:“ReadConsoleOutputCharacterW”:无法将参数 2 从“char *”转换为“LPWSTR”

#include <windows.h>
#include <stdio.h>

int main(void)
{
    HANDLE hOut;
    char letter;
    char letters[5];
    DWORD numberRead;
    COORD where_;

    SetConsoleTitle(L"Hello!");
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    where_.X = 0;
    where_.Y = 0;
    ReadConsoleOutputCharacter(hOut, &letter, 1, where_, &numberRead);
    printf("letter at (0,0) is %c letter", letter);
    return 0;
}

最佳答案

似乎您正在编译时启用了 unicode 支持(因为 ReadConsoleOutputCharacter 解析为 ReadConsoleOutputCharacterW ,否则它将解析为 ReadConsoleOutputCharacterA )。

这意味着与任何 WinAPI 函数一起使用的所有字符串和字符都需要是宽字符 WCHAR 而不是 charLPWSTR 而不是 LPSTR ,....或者您通过取消定义适当的预处理器符号( UNICODE_UNICODE ,我认为).但在这种情况下,您的 SetConsoleTitle 调用将不再有效,因为您显式地向它传递了一个宽字符串。

但最灵活的方法是使用 TCHAR 而不是 charLPTSTR 而不是 LPSTR 等等。这些只是根据 UNICODE 预处理器符号的定义定义为正确的类型。在这种情况下,代码保持广泛独立于 unicode 支持。但在这种情况下,您必须将所有字符串文字包装在 _TTTEXT 宏中:

//non-unicode
const char *str = "something";

//unicode
const WCHAR *str = L"something";

//unicode-agnostic
const TCHAR *str = _T("something");

有关问题的介绍,请参阅 here

如果你真的不需要 unicode 支持,只需要一些简单的 WinAPI 函数,并希望它们与 C 标准库很好地交互(就像你的情况一样),那么取消定义 UNICODE_UNICODE 并使用标准 char s。在这种情况下,还要从字符串文字中删除 L 修饰符。

关于c - 使用第二个参数的 ReadConsoleOutputCharacter 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903341/

相关文章:

c - ListView 滚动条闪烁

c - 在 C 中使用 strcat

c - 上交所指令

c - fileno() 不可用?

c++ - Opengl 纹理有时会在窗口调整大小时闪烁/移动

c++ - 在WINAPI中动态创建按钮

c - 初始化一个int有什么副作用吗?

c - memset 无法正常工作

windows - XP 系统上的 GetProductInfo

c++ - 如何使用 CMake 在 Windows 上将 C++ 应用程序入口点设置为 main()?