2番目のパラメーターを使用したReadConsoleOutputCharacterエラー

c winapi
2番目のパラメーターを使用したReadConsoleOutputCharacterエラー
#include
#include

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  1


ベストアンサー

Unicodeサポートを有効にしてコンパイルしているようです( ReadConsoleOutputCharacter`が ReadConsoleOutputCharacterW`に解決されるため、そうでない場合は `ReadConsoleOutputCharacterA`に解決されるため)。

つまり、WinAPI関数で使用されるすべての文字列と文字は、ワイド文字である必要があります。「char」ではなく「WCHAR」、「LPSTR」ではなく「LPWSTR」、…​ または、適切なプリプロセッサシンボル( UNICODE`と _UNICODE`、私が思う)の定義を解除することにより、ユニコードを無効にします。 しかしこの場合、明示的にワイド文字列を渡すため、 `SetConsoleTitle`呼び出しは機能しなくなります。

しかし、最も柔軟な方法は、「c​​har」の代わりに「TCHAR」、「LPSTR」などの代わりに「LPTSTR」を使用することです。 これらは、 UNICODE`プリプロセッサシンボルの定義に応じて正しいタイプに定義されています。 この場合、コードはユニコードのサポートとは大きく独立しています。 ただし、この場合、すべての文字列リテラルを `_T、` T`または `TEXT`マクロでラップする必要があります。

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

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

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

この問題の概要については、http://en.wikibooks.org/wiki/Windows_Programming/Unicode [こちら]をご覧ください。

ユニコードのサポートが本当に必要なく、いくつかの単純なWinAPI関数のみが必要で、C標準ライブラリとうまくやり取りしたい場合(あなたの場合のように)、「UNICODE」と「 _UNICODE`および標準の `char`を使用します。 この場合、文字列リテラルから `L`修飾子も削除します。

2


タイトルとURLをコピーしました