回答編集履歴

12

minor changes

2018/02/27 10:29

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
   LPCWSTR x = L"...";
20
20
 
21
- LPCWSTR x = TEXT"...";
21
+ LPCWSTR x = TEXT("...");
22
22
 
23
23
  → LPCTSTR x = _T("...");
24
24
 

11

bugがありました

2018/02/27 10:28

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -14,11 +14,11 @@
14
14
 
15
15
  0. 文字列は_T()で囲む
16
16
 
17
- LPSTR x = "...";
17
+ LPCSTR x = "...";
18
-
18
+
19
-  LPWSTR x = L"...";
19
+  LPCWSTR x = L"...";
20
-
20
+
21
- LPWSTR x = TEXT"...";
21
+ LPCWSTR x = TEXT"...";
22
22
 
23
23
  → LPCTSTR x = _T("...");
24
24
 

10

mistyping 処理

2018/02/27 10:27

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -118,7 +118,7 @@
118
118
 
119
119
 
120
120
 
121
- なので単にconst_cast<LPSTR>(Lender3)を使用するとUnicode設定下には使えないコードになってしまます。そしてAnsiコードよりUnicodeを使用するのをお勧めします。
121
+ なので単にconst_cast<LPSTR>(Lender3)を使用するとUnicode設定下には使えないコードになってしまます。そしてAnsiコードよりUnicodeを使用するのをお勧めします。
122
122
 
123
123
 
124
124
 

9

mistyping

2018/02/27 10:20

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- 0. strlenなどの標準C関数使用注意
27
+ 0. strlenなどの標準C関数使用時に注意
28
28
 
29
29
  strlen : Ansi用
30
30
 

8

bugがありました

2018/02/27 10:15

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  LPWSTR x = TEXT"...";
22
22
 
23
- → LPTSTR x = _T("...");
23
+ → LPCTSTR x = _T("...");
24
24
 
25
25
 
26
26
 

7

debugged

2018/02/27 10:14

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -242,8 +242,8 @@
242
242
 
243
243
  **2類関数には p1はできない。p2, arrはオッケー。**
244
244
 
245
- **LPTSTR変数 -> LPCTSTR因数 : OK **
245
+ **LPTSTR変数 -> LPCTSTR因数 : OK**
246
-
246
+
247
- **LPCTSTR変数 -> LPTSTR因数 : Error **
247
+ **LPCTSTR変数 -> LPTSTR因数 : Error**
248
248
 
249
249
  って言うことです。

6

debugged

2018/02/27 09:33

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -242,4 +242,8 @@
242
242
 
243
243
  **2類関数には p1はできない。p2, arrはオッケー。**
244
244
 
245
+ **LPTSTR変数 -> LPCTSTR因数 : OK **
246
+
247
+ **LPCTSTR変数 -> LPTSTR因数 : Error **
248
+
245
249
  って言うことです。

5

バッグ

2018/02/27 09:31

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -156,7 +156,7 @@
156
156
 
157
157
 
158
158
 
159
- 1. LPCTSTR, LPCWSTR, LPCSTRなど、Cがついたもの(例:CreateWindowEx)
159
+ 1. LPCTSTR, LPCWSTR, LPCSTRなど、Cがついたものを因数に取る関数(例:CreateWindowEx)
160
160
 
161
161
  2. そうでないもの(LPTSTR, LPWSTR, LPSTRなど)(例:DrawTextEx)
162
162
 

4

要請により追加

2018/02/27 09:13

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
 
78
78
 
79
- そして、3番のTは設定によって変わります。
79
+ そして、4番のTは設定によって変わります。
80
80
 
81
81
  設定がUnicodeになっている場合Tの部分がWに変わり、そうでない場合Tの部分が無くなります。
82
82
 
@@ -123,3 +123,123 @@
123
123
 
124
124
 
125
125
  ---
126
+
127
+
128
+
129
+ 追加
130
+
131
+
132
+
133
+ C言語の基礎に戻って考えてみますと""で囲まれた文字列ってすべてConstですね。
134
+
135
+
136
+
137
+ ```ここに言語を入力
138
+
139
+ const char *p1 = "..."; // OK
140
+
141
+ char *p2 = "..." // Error(昔の本やコンパイラーの場合許可される場合もあるがこれはエラーです)
142
+
143
+ p1[0] = 'd'; // Error. 文字列はconst.
144
+
145
+ ```
146
+
147
+ ここまでは分かっていると思います。
148
+
149
+
150
+
151
+
152
+
153
+ マクロの中のCは文字コードとは関係ありませんがそれなりに重要な意味があります。
154
+
155
+ マクロの中のCの観点からみるとWinAPIやMFC関数の中で文字列を因数にするものは大体二つの種類があります。
156
+
157
+
158
+
159
+ 1. LPCTSTR, LPCWSTR, LPCSTRなど、Cがついたもの(例:CreateWindowEx)
160
+
161
+ 2. そうでないもの(LPTSTR, LPWSTR, LPSTRなど)(例:DrawTextEx)
162
+
163
+ がそれです。
164
+
165
+
166
+
167
+ 1の場合は因数の中身が変更されない
168
+
169
+ 2の場合は因数の中身が変更される可能性がある。
170
+
171
+ っていうことです。
172
+
173
+
174
+
175
+ 詳しく説明すると関数の因数でCがついたものたち(1類)は
176
+
177
+ ```ここに言語を入力
178
+
179
+ p1[0] = 'd';
180
+
181
+ ```
182
+
183
+ みたいな行動を**関数の中で絶対しない**っていういわゆる保障的なものです。
184
+
185
+ しかし、2類関数たちはそんな保証をしません。
186
+
187
+ なので因数の中身が変更される可能性がいつでもあります。
188
+
189
+
190
+
191
+ 最初に戻ってDrawTextExを見ますと
192
+
193
+ ```ここに言語を入力
194
+
195
+ int DrawTextEx(
196
+
197
+ _In_ HDC hdc,
198
+
199
+ _Inout_ LPTSTR lpchText,
200
+
201
+ _In_ int cchText,
202
+
203
+ _Inout_ LPRECT lprc,
204
+
205
+ _In_ UINT dwDTFormat,
206
+
207
+ _In_ LPDRAWTEXTPARAMS lpDTParams
208
+
209
+ );
210
+
211
+ ```
212
+
213
+ 2番目の因数が**LPTSTR**ですね。
214
+
215
+ なのでこの関数の中でlpchTextが指している内容が変更される(もしくは可能性がある)っていうことで、
216
+
217
+
218
+
219
+ ```ここに言語を入力
220
+
221
+ LPCTSTR p1 = _T("...");
222
+
223
+ LPTSTR p2 = new TCHAR[1024];
224
+
225
+ TCHAR arr[1024] = _T("...");
226
+
227
+
228
+
229
+ DrawTextEx(..., p1, ...); // Error: p1[0] = 'd';と全く同じコードになります。
230
+
231
+ DrawTextEx(..., p2, ...); // OK: newで作られたメモリーは書き込むことができます。
232
+
233
+ DrawTextEx(..., arr, ...); // OK: 配列は書き込むことができます。
234
+
235
+ ```
236
+
237
+
238
+
239
+ なんか長くなりましたが要すると
240
+
241
+ **1類関数には p1, p2, arrどちらでもいい。**
242
+
243
+ **2類関数には p1はできない。p2, arrはオッケー。**
244
+
245
+ って言うことです。

3

minor changes

2018/02/27 09:11

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -31,6 +31,8 @@
31
31
   wcslen : Unicode用
32
32
 
33
33
   tcslen : strlenの T version.
34
+
35
+ 0. なるべくUnicode設定を使用する
34
36
 
35
37
 
36
38
 

2

minor changes

2018/02/27 02:05

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -16,9 +16,9 @@
16
16
 
17
17
  LPSTR x = "...";
18
18
 
19
-  LPSTR x = L"...";
19
+  LPWSTR x = L"...";
20
20
 
21
- LPSTR x = TEXT"...";
21
+ LPWSTR x = TEXT"...";
22
22
 
23
23
  → LPTSTR x = _T("...");
24
24
 

1

minor changes

2018/02/27 02:04

投稿

gazette2
gazette2

スコア179

test CHANGED
@@ -14,7 +14,13 @@
14
14
 
15
15
  0. 文字列は_T()で囲む
16
16
 
17
+ LPSTR x = "...";
18
+
19
+  LPSTR x = L"...";
20
+
21
+ LPSTR x = TEXT"...";
22
+
17
- LPSTR x = "..."; → LPTSTR x = _T("...");
23
+ → LPTSTR x = _T("...");
18
24
 
19
25
 
20
26