ページ 11

Win32apiの文字列について

Posted: 2016年6月04日(土) 21:12
by notebook
LPTSTR型の文字列へのリテラルの代入の仕方がわかりません。

char *x ="123";

このxをLPTSTR lptStrに渡したい場合

LPTSTR lptStr = TEXT(x);
LPTSTR lptStr = x;

としてもダメでした…
なぜでしょう?

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 21:19
by へにっくす
LPTSTRは設定によってwchar*かchar*に切り替わる型です。
そこにchar*固定であるxを代入しても無理があります。

リテラルの文字列であればあなたの示した通り、TEXTマクロを使います。
それをchar*変数であるxを入れるのは間違いです。
xの型もLPTSTRにしないといけません。

コード:

LPTSTR x = TEXT("123");
LPTSTR lptStr = x;

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 21:29
by notebook
へにっくすさん回答ありがとうございます。
win32プロジェクトでchar型の亜種が出てきまくって大変手こずっております。
もう少し教えてほしいのですが

シングルバイト文字、マルチバイト文字、ユニコード、ワイド文字の違いを教えてください。
頭がおかしくなりそうです。

char xはマルチバイト?シングルバイト?ユニコード?

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 21:34
by notebook
LPTSTR a[20];

a[0]='x';
a[1]='y';
LPTSTR lptStr = a;

これエラーでました…

lptstrがxyという文字列になってほしいだけなのに…

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 21:36
by みけCAT
LPTSTRはPが入っていることからわかるようにポインタなので、aの型が間違っています。

コード:

TCHAR a[20];
とするべきでしょう。
さらに、文字定数もTEXTマクロを使って

コード:

a[0]=TEXT('x');
a[1]=TEXT('y');
とするといいでしょう。
また、aの内容を文字列として使用するには最後にナル文字をいれないといけないことに注意してください。

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 21:44
by notebook
????

でも同じポインタ型である

char *は

char *x

x[0]='a';

ってできますよね????

LPTSTRの場合はできないと?

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 21:48
by notebook
TCHAR x[20];

x[0]=TEXT('a');
x[1]=TEXT('\0');

LPTSTR lptStr=x


これで文字列aが実現できました。

ちなみに連結とかはどうすれば?

lptstr=x+TEXT("bcd");

でabcdってしたくても無理でした。

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 22:22
by みけCAT
notebook さんが書きました:????

でも同じポインタ型である

char *は

char *x

x[0]='a';

ってできますよね????

LPTSTRの場合はできないと?
できます。同じようにやればいいです。charではなくchar *がポインタ型であることに注意してください。
なお、配列とポインタは同じものではありません。

コード:

LPTSTR x;

/* xに有効な領域へのポインタを代入する */

x[0] = TEXT('a');
notebook さんが書きました:ちなみに連結とかはどうすれば?
StringCchCat関数が使えるはずです。

Re: Win32apiの文字列について

Posted: 2016年6月04日(土) 22:34
by notebook
俺にはWin32 APIは敷居が高すぎるということで、あきらめることにしました。
大変申し訳ありません。Windows フォーム アプリケーションで作ろうと思います。