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;
}
答案 0 :(得分:2)
您似乎正在编译启用了unicode支持(因为ReadConsoleOutputCharacter
解析为ReadConsoleOutputCharacterW
,否则它将解析为ReadConsoleOutputCharacterA
)。
这意味着与任何WinAPI函数一起使用的所有字符串和字符都需要是宽字符WCHAR
而不是char
和LPWSTR
而不是LPSTR
,....或者您通过取消定义适当的预处理器符号(UNICODE
和_UNICODE
来禁用unicode)。但在这种情况下,您的SetConsoleTitle
调用将不再有效,因为您明确地将其传递给了一个宽字符串。
但最灵活的方法是使用TCHAR
代替char
和LPTSTR
代替LPSTR
等。这些只是根据UNICODE
预处理程序符号的定义定义为正确的类型。在这种情况下,代码保持广泛独立于unicode支持。但在这种情况下,您必须将所有字符串文字包装在_T
,T
或TEXT
宏中:
//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
修饰符。