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
而不是 char
和 LPWSTR
而不是 LPSTR
,....或者您通过取消定义适当的预处理器符号( 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 标准库很好地交互(就像你的情况一样),那么取消定义 UNICODE
和_UNICODE
并使用标准 char
s。在这种情况下,还要从字符串文字中删除 L
修饰符。
关于c - 使用第二个参数的 ReadConsoleOutputCharacter 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903341/