質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

19548閲覧

VC++でLPTSTRに何を代入すればいいかわかりません。

ofu

総合スコア11

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2016/01/07 21:23

すいません、自作関数averageの結果を表示するプログラムを作りたいのですが...

C++

1//プログラムの一部分です 2 3LPTSTR moz; 4 5wsprintf(moz,L"%d",average(6, 8, 5, 7, 4, 5, 7)); 6 7TextOut(hdc1n, 0, 0,moz, sizeof moz);

このように、LPTSTRのmoz(文字列を格納するバッファ)に何を代入すればいいかわかりません。

なので、教えてください!

izkn👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Windowsのプログラムをやっていると結構躓く箇所ですね。

いきなりLPTSTRとかLPTCSTRとか出てきてAPI関数の引数とかに指定されているので戸惑う気持ちはわかります。私もそうでしたし、後輩からもよく質問されました。
文字列のポインタをマクロ定義しているだけなので、ルールが判ってくると使いこなせるようになります。

かなりおおざっぱですが、下記のように分解してみると判りやすいです。

LP:ポインタである
T:ビルドオプションによって、char型とwchar_t型に自動で切り替わる文字列
C:const変数
STR:文字列

今回LPTSTRなので、マルチバイト環境だとchar型、UNICODE環境だとwchar_t型のポインタ、ということになります。

ただ、上記を理解して場面によって、char型、wchar_t型を使い分けるのは面倒なので、文字列を定義したり、変数を宣言したりする際に使えるマクロも用意されています。

_T("abcd")とか、TCHAR buf[32]とかの記述がそれです。固定文字の場合_T("")で宣言してやると自動でchar型またはwchar_t型に切り替わります。変数もTCHARで宣言してやると自動で切り替わるので、特に意識せずにAPI関数への引数に渡してやることができます。

Windows環境以外に使用しないコードであれば、上記マクロを積極的に使うと、文字列の型で悩むことが少ないと思います。

投稿2016/01/08 04:37

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ofu

2016/01/08 08:17

ありがとうございます! やはり、ここはほとんどのプログラマーの方が戸惑うところでしたか。 しかし、意味が分かってよかったです。名前にも、由来っていうのがありますからね。 将来くらいに自作言語を作る際は気を付けたいです。
guest

0

ベストアンサー

とりあえず、このように書いてください。

C++

1WCHAR moz[20]; 2int length = wsprintf(moz, L"%d", average(6, 8, 5, 7, 4, 5, 7)); 3TextOut(hdc1n, 0, 0, moz, length);

L"%d"という記述から、既定の「Unicode文字セットを使用する」オプションが設定されていると判断します。したがって、Win32 APIで定義されているLPTSTRWCHAR *と同じになります。
ちなみに、WCHARはwchar_tのtypedefですので、`wchar_t moz[20];'と書いても問題ありません。

Win32 APIのwsprintfを含めて、sprintf系関数に渡す「文字列バッファ」には、格納される文字列が充分に収まるサイズの領域を渡す必要があります。したがって、ポインタを渡すのではなく、上記コードのように配列変数として定義した領域を渡してください。

TextOut関数の最後の引数には「文字数」を渡す必要があるので、sizeofで取得できる変数のサイズを渡しても正しく処理されません。wsprintf関数は文字列バッファに格納した文字数を返すので、その値を利用します。C標準関数のwcslenで文字数を取得してもかまいません。

投稿2016/01/07 22:20

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ofu

2016/01/08 08:22

なるほど、LPTSTRはwchar_t*(WCHAR*)の置き換え版ですかのようなものですか。 それと、sizeofはあくまでサイズを取得するものであって文字数は取得できないんですね。薄々戸惑ってはいたんですがやはりそうですか。文字数はwcslen関数ですね。 わざわざコードも書いてくださりありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問