4

プログラムで C 用の win32 api を使用してシリアル ポートから読み取っていますが、これはかなり低レベルのもののようです。シリアル ポートから読み取るより良い方法がないと仮定すると、CreateFile 関数には LPCWSTR 引数が含まれます。私が読んだところ、LPCWSTR は wchar_t 型のようです。まず、wchar と char の違いがよくわかりません。ANSI と Unicode については読んだことがありますが、それが自分の状況にどのように当てはまるかはよくわかりません。

私のプログラムは wmain ではなく main 関数を使用しており、コマンド ラインから引数を取得して wchar_t 変数に格納する必要があります。その場で弦を作っただけなら、これができることがわかりました。

wchar_t variable[1024];
swprintf(variable,1024,L"%s",L"randomstringETC");

L が char 配列を wchar 配列に変換するように見えるためです。ただし、私が行うと機能しません。

wchar_t variable[1024];
swprintf(variable,1024,L"%s",Largv[1]);

明らかに構文エラーだからです。私の質問は、通常の文字列を wchar_t 文字列に変換する簡単な方法はありますか?

または、このUnicodeのものを完全に回避し、WindowsでCを使用して別の方法でシリアルから読み取る方法はありますか..

4

3 に答える 3

4

CreateFileという名前のwinapi関数はありません。CreateFileWとCreateFileAがあります。CreateFileは、_UNICODEマクロが定義されているかどうかに応じて、これらの実際の関数の1つにマップされるマクロです。CreateFileWはLPCWSTR(別名const wchar_t *)を取り、CreateFileAはLPCSTR(別名const char *)を取ります。

Unicodeに移行する準備がまだできていない場合は、CreateFileA()関数を明示的に使用してください。または、プロジェクト設定を変更します:プロジェクト+プロパティ、一般、文字セット。ゼロ以外のコストがあり、基盤となるオペレーティングシステムは完全にUnicodeベースです。したがって、CreateFileA()は、現在のシステムコードページに従ってconstchar*をconstwchar_t*に変換する変換レイヤーを通過します。

于 2011-09-07T12:19:09.923 に答える
1

L は文字列リテラル専用です。

winapimbstowcs()関数などを使用して、argv 文字列 (おそらく unsigned char) を wchar に変換する必要があります。

于 2011-09-07T12:00:56.193 に答える
1

MultiByteToWideCharを使用して、ANSI から UNICODE にマップできます。呼び出しを行うには、次のようなswprintf配列を定義する必要があります。wchar

WCHAR lala[256] = {0};
swprintf(lala, _countof(lala), L"%s", Largv[1]);

マルチバイト文字セットに対してアプリケーションをコンパイルすることで Unicode を回避することは可能ですが、従来の理由でそうしている場合を除き、これを行うことはお勧めできません。いずれにせよ、Windows は、基になる OS のエンコーディングであるため、最終的にはある時点でユニコードに変換する必要があります。

于 2011-09-07T11:58:05.810 に答える