私はこのスニペットを使用して、dllの中にコンソールfronを作成します。そのDLLはゲームにロードされます。WriteConsole()不自然な文字ですか?
コンソールウィンドウが罰金作成されます。しかし、私はそれにものを書くとき、私はちょうど "??? D ??"のようなものを得る。
私はprintf()構文を使用する必要があることを知っています。だから私は使用する
wprintf("%s", "test");
すべてのポインタ?
私はこのスニペットを使用して、dllの中にコンソールfronを作成します。そのDLLはゲームにロードされます。WriteConsole()不自然な文字ですか?
コンソールウィンドウが罰金作成されます。しかし、私はそれにものを書くとき、私はちょうど "??? D ??"のようなものを得る。
私はprintf()構文を使用する必要があることを知っています。だから私は使用する
wprintf("%s", "test");
すべてのポインタ?
を使用してみてくださいwprintfの内容:
wprintf("%s", L"test");
wprintfの%sはワイド文字列を必要としますエスト "です。
wprintfは次のように定義されているので、私はformatパラメータに「L」を削除:あなたはwprintf()、printf関数の「ワイド文字」バージョン()ルーチンを呼び出している
int wprintf(char *fmt, ...)
wstring文字を使用しているためエンコーディングが間違っていますが、おそらくASCIIコンソールしかありません。コンソールでユニコードフォントを使用していることを確認してください。 wprintf編集入力として
をワイド文字列を取るよう
wprintf(L"%s", "test");
を::%sの動作と%S変更はで使用されるという事実に基づいて
ああ、私はUnicodeのサポートを必要としないので、ansi関数に書き直してください。 – JustFogMaxi
彼はwprintf引数としてwstring文字を使用していません。 – xtofl
。 "%s"の意味が変わるという点で、これらの "ワイドキャラクタ"関数には1つの厄介なキャッチがあります:
printf() - "%s"は引数が普通の文字列であることを意味し、 "%S"はそれを意味しますワイド文字列
wprintf() - 「%s」の引数はワイド文字列であることを意味し、「%Sは、」それはそうwprintfへのお電話は()ことを通知された通常の文字列
だ意味します引数はワイド文字の文字列ですが、そうではありません。
"%s" ringはwprintfに最初の引数をワイド文字列として解釈する必要があることを伝えます。
これらの混合エンコーディングの問題を回避するには、使用することができますTCHARマクロの:
LPCTSTR pName = _T("World");
_tprintf(_T("%s, %s"), _T("Hello"), pName);
良い習慣は、私たちがASCIIを使用するときに何もしないとLとのすべての文字列を付加しますポータビリティマクロ_T()を使用することですUNICODEが定義されているときまた、_tを使用するとprepended関数が使用されます。これは、ASCIIを使用するときはプレーン関数にマップし、UNICODEが定義されているときはwの前に付いた関数にマップします。あなたはいつも、両方のバージョンで動作する移植可能なコードを持っています。
_tprintf(_T("%s"),_T("test");
'void wprintf(char *、...)) ':引数1を' const wchar_t [18] 'から' char * 'に変換できません – SSpoke