使用第二个参数的ReadConsoleOutputCharacter错误

时间:2011-10-26 13:32:26

标签: 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;
}

1 个答案:

答案 0 :(得分:2)

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

这意味着与任何WinAPI函数一起使用的所有字符串和字符都需要是宽字符WCHAR而不是charLPWSTR而不是LPSTR,....或者您通过取消定义适当的预处理器符号(UNICODE_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标准库很好地接口(就像你的情况那样),那么最好不要定义{{ 1}}和UNICODE并使用标准_UNICODE s。在这种情况下,还要从字符串文字中删除char修饰符。