7

基本的に、私はファイルに対していくつかのことを行ういくつかの単純なコードを持っており、それをWindowsに移植しようとしています。私はこのように見えるものを持っています:

int SomeFileCall(const char * filename){
#ifndef __unix__
    SomeWindowsFileCall(filename);
#endif
#ifdef __unix__
    /**** Some unix only stat code here! ****/
#endif
}

この行SomeWindowsFileCall(filename);により、コンパイラエラーが発生します。 cannot convert parameter 1 from 'const char *' to 'LPCWSTR'

SomeFileCallプロトタイプを変更せずにこれを修正するにはどうすればよいですか?

4

6 に答える 6

11

文字列を受け取るほとんどのWindowsAPIには、2つのバージョンがあります。1つは取るchar *、もう1つは取るWCHAR *(後者はと同等ですwchar_t *)。

SetWindowTextたとえば、は実際にはSetWindowTextA(をとるchar *)またはSetWindowTextW(をとる)のいずれかに展開されるマクロですWCHAR *

プロジェクトでは、これらのマクロはすべて-Wバージョンを参照しているようです。これは、UNICODEプリプロセッサマクロ(Visual Studioで[Unicode文字セットを使用]プロジェクトオプションを選択した場合に定義されます)によって制御されます。(MicrosoftのCおよびC ++ランタイムライブラリ関数の一部には、ANSIバージョンとワイドバージョンもあります。どちらを取得するかは_UNICODE、そのVisualStudioプロジェクト設定でも定義されている同様の名前のマクロによって選択されます。)

通常、アプリケーションがUnicode用にコンパイルされている場合でも、-A関数と-W関数の両方がライブラリに存在し、使用できます。(例外があります。一部の新しい機能は、「ワイド」バージョンでのみ使用できます。)

char *適切なANSIコードページにテキストを含むが含まれている場合は、-Aバージョンを明示的に呼び出すことができます(例:) SetWindowTextA。-Aバージョンは通常、文字列パラメーターのワイド文字コピーを作成し、-Wバージョンに制御を渡すラッパーです。

別の方法は、文字列の独自のワイド文字コピーを作成することです。これは、 MultiByteToWideCharを使用して実行できます。バッファを管理する必要があるため、呼び出すのは難しい場合があります。-Aバージョンを直接呼び出すことを回避できる場合、それは一般的に単純であり、すでにテストされています。ただし、char *文字列がUTF-8またはユーザーの現在のANSIコードページ以外のエンコーディングを使用している場合は、自分で変換を行う必要があります。

ボーナス情報

-A接尾辞は、「ANSI」を表します。これは、シングルバイトコードページの文字セットの一般的なWindows用語でした。

-Wサフィックスは「ワイド」を表します(エンコーディング単位が1バイトより広いことを意味します)。具体的には、Windowsはワイド文字列にリトルエンディアンUTF-16を使用します。MSDNのドキュメントでは、これを単に「Unicode」と呼んでいますが、これは少し誤称です。

于 2012-05-23T22:20:49.333 に答える
3

ANSI文字セットを使用するようにプロジェクトを構成します。(一般->文字セット)

TCHAR、WCHAR、LPSTR、LPWSTR、LPCTSTRなどとは何ですか。

typedef const wchar_t * LPCWSTR;

于 2012-05-23T20:48:56.270 に答える
2

{プロジェクトのプロパティ->詳細->文字セット->マルチバイト文字セットを使用}これらの手順を実行すると、問題は解決します

于 2020-09-18T10:07:39.793 に答える
1

WinApiを使用してUnicodeモードでビルドしているため、すべての文字列パラメータが幅の広い文字列に解決されます。最も簡単な修正は、WinApiをANSIに変更することです。それ以外の場合は、wchar_t*からのコンテンツfilenameを使用してを作成し、それを引数として使用する必要があります。

于 2012-05-23T20:48:08.033 に答える
1

文字セットを「マルチバイト文字セットを使用」に設定することで、このエラーを解決できます[プロジェクトプロパティ->構成プロパティ->一般->文字セット->「マルチバイト文字セットを使用」

于 2018-11-08T06:01:20.753 に答える
0

使用しているコンパイラはわかりませんが、Visual Studioでは、デフォルトのcharタイプ(UNICODEまたはマルチバイト)を指定できます。あなたの場合、UNICODEがデフォルトであるかのように聞こえるので、最も簡単な解決策は、デフォルトのchar型を決定する特定のコンパイラのスイッチをチェックすることです。そうしないと、作業を節約できるため、コードを追加して前後に変換することになります。不要なオーバーヘッドを追加する可能性のあるUNICODEは、追加のエラーの原因となる可能性があります。

于 2012-05-23T21:01:54.867 に答える