• ベストアンサー

LPCWSTRとchar

質問なのです・・・ 現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、 charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。 参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

  • krit
  • お礼率91% (21/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • keibou21
  • ベストアンサー率31% (18/58)
回答No.6

補足です。 2005デフォルトのUNICODEを変更する方法は プロジェクト->プロパティ->構成プロパティ->全般 の中にある 文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する] に変更することで可能です。

krit
質問者

お礼

ありがとうございます!!! 今、変更してビルドしてみたら正常にビルドできました!!! ほんとうにありがとうございます!

その他の回答 (6)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.7

> wchar_tではなぜかエラーが出てしまいできませんでした 多分、今度は他の char を要求している部分がエラーになってしまったのでしょう。 ちなみに、SJIS(ShiftJIS)はマルチバイト文字セット(文字の種類によって一文字のバイト数が違う)の一種です。通常、C++としてはcharを使います。 一方、MicrosoftがいうUNICODEはワイド文字セットといわれ、一文字のバイト数が固定で複数バイト(2、または4:VCは2)あります。通常、C++としてはwchar_tを使います。 そして、Windowsでは、両者をオプションで切り替えやすいように、TCHARというマクロを用意しています。 本来、WindowsのAPI等を呼ぶときにはこれらを正しく判断して区別しなければなりません。 お使いの参考書は、正しくこれを区別していなかったため、バージョンが変わったらエラーになったものと思われます。 初心者への説明のために、あえて wchar_t のような新しい型を用いなかったのか、作者がそういう注意を払わない人だったのかわかりませんが…。

krit
質問者

お礼

なるほど・・・ わかりやすい解説ありがとうございます!!

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

LPTSTRなどTCHAR用の関数にcharを渡したのだと思います。 2003は、デフォルトでSJISですからcharのままで通りますが、デフォルトがUNICODEになっていると、charでは通らないので。 charの代わりにTCHARやwchar_tに読み替えることで対応できると思います。

krit
質問者

お礼

wchar_tではなぜかエラーが出てしまいできませんでした 2003と2005はSJISとUnicodeが違うのですね!!初めて知りました!! 情報ありがとうございます!!!

回答No.4

多分、WCHAR(wchar_t)配列を引数と取る関数で char配列を渡したんだと思う。 違うかもしれんが。

krit
質問者

お礼

私も、そうかと思い・・・wchar_tで渡したのですが・・・エラーが出てしまいました。 ほかにいろいろ試して見ます!!

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

No2の方が、言われているソースコードの意味ですが、これは、質問者さまが今コンパイルしようとしているファイルのことを示します。 具体的にはwindow.cppのファイルのことです。これを提示されてみては、いかがでしょうか。

krit
質問者

お礼

わかりました。 提示します!

回答No.2

そのエラーを吐いた"ソースコード"を呈示してください。

krit
質問者

お礼

すみません長くなるので一部を取ります char clsName[] = "D3DFWSampleClass"; // ウィンドウクラス名 HWND hWnd; MSG msg; // ウィンドウクラスの初期化 WNDCLASSEX wcex = { sizeof(WNDCLASSEX), // この構造体のサイズ NULL, // ウインドウのスタイル(default) WindowProc, // メッセージ処理関数の登録 0, // 通常は使わないので常に0 0, // 通常は使わないので常に0 hInstance, // インスタンスへのハンドル NULL, // アイコン(なし) LoadCursor(NULL, IDC_ARROW), // カーソルの形 NULL, NULL, // 背景なし、メニューなし clsName, // クラス名の指定 NULL // 小アイコン(なし) }; です

回答No.1

コードの呈示がなくてはコメントのしようがありません。

krit
質問者

お礼

c:\program files\microsoft directx sdk (june 2006)\include\d3d9types.h(1385) : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 1>c:\documents and settings\xxx\my documents\visual studio 2005\projects\d3dfwsamplw\d3dfwsamplw\window.cpp(57) : error C2440: '初期化中' : 'char [17]' から 'LPCWSTR' に変換できません。 というエラーです

関連するQ&A

  • CHAR型ポインタについて。

    CHAR型ポインタについて。 当方C言語初心者です。 ポインタと文字列の関係分からないことが出てきました。 参考にしている本があり、そのページに下記のソースで「const char *pc1」のポインタ変数を用意して、そこに直接文字列を代入しています。 本来、「char *pc1」はchar型のアドレスを格納するための変数のはずなのに、その変数に文字列を代入してることに疑問を感じました。 この記述の仕方は間違っていないのでしょうか?また、アドレスを格納するための変数「*pc1」に「abcdefg」の文字列はどのようにメモリ上で格納されているのでしょうか? 知ってどうなるの?みたいな質問かもしれませんが、ご教授いただけると幸いです。 #include <stdlib.h> #include <string.h> void func(void) { const char *pc1 = "abcdefg"; //←ココ char *pc2 = (char *)malloc( strlen(pc1) +1); if ( pc2 ) { strcpy( pc2, pc1 ); free( pc2 ); } }

  • char型について【初心者です】

    プログラミング初心者です。 char型について質問です。 一般的にchar型とは文字列の定義という風に教えてもらったことがあるのですが、言語やデータベースによってchar型の定義は違うものなのでしょうか? 例えば、javaでは   char a = 'あ' というように、文字が全角一文字しか定義できないのに対して、SQLでテーブルを定義するときでは「長さ:10」というように文字を一文字以上格納できるので、大変疑問です。(この考え方が間違っているのでしょうか?) SQLの「長さ」というのも具体的に何の長さなのか分かりません。 かなりの初心者と思われるでしょうが分かりやすい回答を頂きたく思います。 よろしくお願いします。

  • char[]をDWORDに格納するには

    お世話になります。 今、VC++でMFCプログラミングをしています。 char Data[256]に格納した文字列を SetAddress()の引数として渡したいのですが、どうしたらよいでしょうか? どうぞよろしくお願い致します。

  • テキストボックス内のテキストをchar配列へ

    Microsoft Visual C++ 2010 Expressで勉強中なのですが、 テキストボックス内に this->textBox1->Text = L":100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF"; このように文字列を入れているのですが、これを char cOrg[128]; この配列に入れるにはどのようにしたら良いのでしょうか?

  • char型変数

    のことで質問があります。 ユニコード文字一文字ということなんですけれども、 たとえば char c = "a"; これはコンパイルエラーになりますよね。 文字列は入れられない。もっともです。 あるテキストの練習問題で、コンパイルエラーになるものはどれですかというのがあって、 char c = 4096; というのがあり、これはエラーだ!、と思ったら、 コンパイルは通りました・・・ ちなみにcの内容を表示してみたら ? と出ました。 これはどういうことですか?? なぜエラーとならないのですか?

    • ベストアンサー
    • Java
  • c言語 int型の数字をchar型の配列に

    c言語についてです。 int型の数字をchar型の配列に入れたいです。 関数に対してint型の数字を文字列として渡し、 関数内でchar型の配列に格納したいです。 例として、 a(char a[]){  ~~  ~~ } int main(void){ int x = 5678;  ~~  a(x); } とできるようにしたいです。 しかしこれだと5678という値がそのままchar型の一つの配列に入る?ため正しくないです。 欲しい結果としてはちゃんとa関数内で、 a[1] = '5' a[2] = '6' a[3] = '7' a[4] = '8' となってほしいです。 もともと渡す値が”5678”となっていれば結果は正しく出るのですが、 渡す値がint型と決まっているためどうにかして5678を”5678”とすればいいのではないかと考えています。 つまり5678を単純に文字列に変換すればいいのでしょうか? またプログラム内ではsprintfやatolを使用しないで実現させたいです。 難しいかもしれませんがお願いします。 なんだか説明が下手ですみません。 お願いいたします。

  • char型のポインタ配列に変数の値の代入できる?

    c言語でchar型のポインタ配列に変数の値を代入できるのでしょうか? 例えば int A[10]={1,2,3,4,5,6,7,8,9,10}; char *C[10]; のCに配列Aの中のデータを文字列として入れたいのです。 C[0]="A[0]"としてもA[0]という文字列が代入されてしまうだけなので… よろしくお願いします。

  • int型とchar型について

    C言語初心者です。 よろしくお願いします。 ◎1----------------------- #include<stdio.h> int main(void) { int ss[4]="789"; printf("%c\n",ss[0]); return 0; } --------------------------- ◎2----------------------- #include<stdio.h> int main(void) { int *p; p="789"; printf("%c\n",*p); return 0; } --------------------------- ◎1、◎2の2つのプログラムについて疑問があります。 ◎1の「int ss[4]="789";」と◎2の「int *p;」のintの部分は今まで、何の疑問も抱かず、「char」として入力していました。 そこでchar型は1バイトの整数、int型は4バイトの整数ということで容量が違うだけで、intとしても大丈夫だろうと思ったのですが、 ◎1では、「'initializing' : 'char [4]' から 'int [4]' に変換することはできません。」とエラーが出て、◎2では「'char [4]' から 'int *' に変換することはできません。」とエラーが出ます。 intは文字列は扱えないということなのでしょうか? 以上intだと実行できない理由がわかりません。 初歩的なことですいませんが、教えていただけると嬉しいです。

  • char*型の文字列をchar[10]へ。

    char*型の文字列をchar[0]から順番に格納したいのですが、 どうやってやるかご存知の方おられますでしょうか。 申し訳ございません、宜しくお願い致します。

  • unsigned char SJis[2]からstd::stringに変換

    開発環境は VC++ 2008 Express Edition あるDLLの関数で戻り値としてShiftJISの1文字が格納された unsigned char SJis[2] が返され,これを呼び出し側のプログラムで使っている文字列 std::string str に順に追加していこうと思っています. そこで, unsigned char tmpSJis[3]; tmpSJis[0] = SJis[0]; tmpSJis[1] = SJis[1]; tmpSJis[2] = '\0'; str += std::string(tmpCode); というコードを書いてループさせたのですが, error C2440: '<function-style-cast>' : 'unsigned char *' から 'std::string' に変換できません。 というエラーが出てしまいうまく変換できません. これを解決する方法はありませんか?