1. ホーム

error C2664:char *strcpy(char *,const char *)& Unable to convert argument 2 from CString&quot to const char *.引数2をCString&quotに変換できない。

2022-02-28 13:20:08
<テーブル

_tcscpy

  関数です。
  文字列をコピーします。この関数にはいくつかのバージョンがある。
  関数のプロトタイプです。
  char *strcpy( char *strDestination, const char *strSource );
  wchar_t *wcscpy( wchar_t *strDestination, const wchar_t *strSource );
  unsigned char *_mbscpy( unsigned char *strDestination, const unsigned char *strSource );
  コモンネーム リクエストヘッダ 互換性スキーム
  strcpy &lt;string.h&gt; ANSI, Win 95, Win NT
  wcscpy &lt;string.h&gt; または &lt;wchar.h&gt; ANSI、Win 95、Win NT
  _mbscpy &lt;mbstring.h&gt; Win 95, Win NT
  パラメータの説明です。
  strDestination 対象文字列へのポインタ
  strSource ソース文字列ポインタ
  戻り値
  3つの形式とも、対象の文字列を返します。値が返されない場合、それは予約されたケースで エラーメッセージ .
  説明文:
  strcpy関数は、strSourceを端末のNULL文字も含めてコピーします。
  wcscpy と _mbscpy は幅が広い バイト とマルチバイト版の strcpy がある。引数や戻り値もワイドバイトやマルチバイトである。
-----------------
VS2005でstrcpy関数を使用したところ、コンパイルが通らない。Webで検索したところ、他の方の回答から転載した以下の理由で、代わりにマクロ_tcscpyでコンパイルされるようです。








I. VS2005 で Unicode または ASCII 文字セットを設定する際の問題点
VS2005でプログラムを開発する場合、デフォルトの文字コードはUnicodeですので、プログラム内で文字列定数を使用する場合は、Unicodeへの変換を表示しないとコンパイル時にエラーとなります。例えば
HDC hScrDC = CreateDC(TEXT("DISPLAY")), NULL, NULL, NULL); //画面用デバイス記述テーブルを作成する。
この文章は、次のように書くと:
HDC hScrDC = CreateDC("DISPLAY"),NULL,NULL,NULL);
以下のエラーでコンパイルします。
error C2664: 'CreateDCW' : cannot convert parameter 1 from 'const char [8]' to 'LPCWSTR'.
このエラーメッセージに基づいて、この文章を次のように変更することができます。
HDC hScrDC = CreateDC((LPCWSTR)"DISPLAY",NULL,NULL,NULL).HDC hScrDC = CreateDC((LPCWSTR)"DISPLAY",NULL,NULL);
これはコンパイルに合格しますが、最終結果は正しくありません(hScrDCの値は0です)!
正しいやり方は2つあります。
1つは、もしプログラムがUnicode文字セットをサポートするようにしたい場合、プログラムを:
HDC hScrDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL).HDC hScrDC = CreateDC(TEXT("DISPLAY"),NULL,NULL);
次に、もしプログラムがユニコード文字セットをサポートしたくない場合、プログラムを変更する必要はありません。プロジェクトの設定を変更するだけです。
プロジェクトメニュー-プロジェクトのプロパティ(最後の一つ)-設定プロパティ-一般-プロジェクトのデフォルト-文字セット、(プロジェクト-> プロパティ-> 設定プロパティ-> 一般-> プロジェクトのデフォルト-> 文字セット)を「ユニコード文字セットを使う」を「設定しない」に変更するだけです。




II. vs2005 ユニコード問題の解決法
今日、私はこの問題について考えてきた、つまり、Microsoftの有名なvstudioの下位互換性を維持する方法、簡単に言えば、直接vc6のプロジェクトを対2005に変換する方法、およびその後、プロジェクトの構成に限りデフォルトmfcプロジェクトのプロパティは、あなたができるマルチバイト文字セットを使用するので、vc6のようにすることができます発見 もちろんユニコード文字エンコーディングにはメリットがありますが、毎回、あなたは文字やインターフェースで表示したい、あなたがしなければならないことです
TCHAR wStr[255] = {0};   
    MultiByteToWideChar(CP_ACP,MB_COMPOSITE,data.payload,256,wStr,254) の変換は非常に面倒でシステムリソースを浪費するので、次回からいくつかの関連プログラムを使用する際にプロジェクトの設定を変更することにしました。開発効率を上げることができる。








(上記はhttp://hi.baidu.com/ncudlz/blog/item/bcf4414ca3e26afcd62afc64.html より取得)








            strcpy関数をwcscpyに変更しても、コンパイルして合格します。




            間違ったコードをコンパイルする。




void playwav(TCHAR * パス)
{
    TCHAR szPath[100];
    memset(szPath, 0, sizeof(szPath))を使用します。
    strcpy(szPath, path);
}
               エラー時のプロンプトを表示します。




               error C2664: "strcpy": 引数 1 を "TCHAR [100]" から "char *" に変換できませんでした。       








               解決策




               1. デフォルトのUnicode文字セット: strcpy関数の代わりにwcscppy関数を使用するか、_tcscpyマクロを使用します。tcscpy はヘッダーファイル tchar.h で定義されています。もし、コンパイラが定義されていないというエラーを報告したら、ヘッダーファイルを参照する必要があります。_tcscpyは、プログラムによって設定された文字セットに従って対応する関数を選択します。もし、Unicode文字セットをサポートしていれば、_tcscpyマクロはwcscppyを使い、もし、ASCIIをサポートしていればstrcpyを使ってください。




               2. 上記2の方法に従って設定し、やはりstrcpy関数を使用する。