2011-10-26 63 views
1

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684969(v=vs.85).aspx 錯誤C2664: 'ReadConsoleOutputCharacterW':無法從 '字符*' 轉換參數2 'LPWSTR'ReadConsoleOutputCharacter錯誤使用第二個參數

#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; 
} 

回答

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標準庫很好地接口(就像你的情況一樣),那麼最好的辦法就是取消定義UNICODE_UNICODE並使用標準char s。在這種情況下,還可以從字符串文字中刪除L修飾符。

+0

thx,你是對的 – gameboy

相關問題