teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

12

minor changes

2018/02/27 10:29

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  0. 文字列は_T()で囲む
9
9
  LPCSTR x = "...";
10
10
   LPCWSTR x = L"...";
11
- LPCWSTR x = TEXT"...";
11
+ LPCWSTR x = TEXT("...");
12
12
  → LPCTSTR x = _T("...");
13
13
 
14
14
  0. strlenなどの標準C関数使用時に注意

11

bugがありました

2018/02/27 10:28

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -6,9 +6,9 @@
6
6
  WCHAR, CHAR → TCHAR
7
7
 
8
8
  0. 文字列は_T()で囲む
9
- LPSTR x = "...";
9
+ LPCSTR x = "...";
10
-  LPWSTR x = L"...";
10
+  LPCWSTR x = L"...";
11
- LPWSTR x = TEXT"...";
11
+ LPCWSTR x = TEXT"...";
12
12
  → LPCTSTR x = _T("...");
13
13
 
14
14
  0. strlenなどの標準C関数使用時に注意

10

mistyping 処理

2018/02/27 10:27

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -58,7 +58,7 @@
58
58
  // ERROR! :DrawTextExの2番目の因数はLPWSTRに翻訳される。LPWSTRが必要な部分にLPSTRを入れるのはエラー。
59
59
  ```
60
60
 
61
- なので単にconst_cast<LPSTR>(Lender3)を使用するとUnicode設定下には使えないコードになってしまます。そしてAnsiコードよりUnicodeを使用するのをお勧めします。
61
+ なので単にconst_cast<LPSTR>(Lender3)を使用するとUnicode設定下には使えないコードになってしまます。そしてAnsiコードよりUnicodeを使用するのをお勧めします。
62
62
 
63
63
  ---
64
64
 

9

mistyping

2018/02/27 10:20

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  LPWSTR x = TEXT"...";
12
12
  → LPCTSTR x = _T("...");
13
13
 
14
- 0. strlenなどの標準C関数使用注意
14
+ 0. strlenなどの標準C関数使用時に注意
15
15
  strlen : Ansi用
16
16
   wcslen : Unicode用
17
17
   tcslen : strlenの T version.

8

bugがありました

2018/02/27 10:15

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -9,7 +9,7 @@
9
9
  LPSTR x = "...";
10
10
   LPWSTR x = L"...";
11
11
  LPWSTR x = TEXT"...";
12
- → LPTSTR x = _T("...");
12
+ → LPCTSTR x = _T("...");
13
13
 
14
14
  0. strlenなどの標準C関数使用し注意
15
15
  strlen : Ansi用

7

debugged

2018/02/27 10:14

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -120,6 +120,6 @@
120
120
  なんか長くなりましたが要すると
121
121
  **1類関数には p1, p2, arrどちらでもいい。**
122
122
  **2類関数には p1はできない。p2, arrはオッケー。**
123
- **LPTSTR変数 -> LPCTSTR因数 : OK **
123
+ **LPTSTR変数 -> LPCTSTR因数 : OK**
124
- **LPCTSTR変数 -> LPTSTR因数 : Error **
124
+ **LPCTSTR変数 -> LPTSTR因数 : Error**
125
125
  って言うことです。

6

debugged

2018/02/27 09:33

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -120,4 +120,6 @@
120
120
  なんか長くなりましたが要すると
121
121
  **1類関数には p1, p2, arrどちらでもいい。**
122
122
  **2類関数には p1はできない。p2, arrはオッケー。**
123
+ **LPTSTR変数 -> LPCTSTR因数 : OK **
124
+ **LPCTSTR変数 -> LPTSTR因数 : Error **
123
125
  って言うことです。

5

バッグ

2018/02/27 09:31

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -77,7 +77,7 @@
77
77
  マクロの中のCは文字コードとは関係ありませんがそれなりに重要な意味があります。
78
78
  マクロの中のCの観点からみるとWinAPIやMFC関数の中で文字列を因数にするものは大体二つの種類があります。
79
79
 
80
- 1. LPCTSTR, LPCWSTR, LPCSTRなど、Cがついたもの(例:CreateWindowEx)
80
+ 1. LPCTSTR, LPCWSTR, LPCSTRなど、Cがついたものを因数に取る関数(例:CreateWindowEx)
81
81
  2. そうでないもの(LPTSTR, LPWSTR, LPSTRなど)(例:DrawTextEx)
82
82
  がそれです。
83
83
 

4

要請により追加

2018/02/27 09:13

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -37,7 +37,7 @@
37
37
  LPWSTR, WCHAR, LPCWSTRなどはすべてUnicodeです。
38
38
  LPSTR, CHAR, LPCSTRなどはAnsiコードです。
39
39
 
40
- そして、3番のTは設定によって変わります。
40
+ そして、4番のTは設定によって変わります。
41
41
  設定がUnicodeになっている場合Tの部分がWに変わり、そうでない場合Tの部分が無くなります。
42
42
 
43
43
  例えばLPTSTRは
@@ -60,4 +60,64 @@
60
60
 
61
61
  なので単にconst_cast<LPSTR>(Lender3)を使用するとUnicode設定下には使えないコードになってしまします。そしてAnsiコードよりUnicodeを使用するのをお勧めします。
62
62
 
63
- ---
63
+ ---
64
+
65
+ 追加
66
+
67
+ C言語の基礎に戻って考えてみますと""で囲まれた文字列ってすべてConstですね。
68
+
69
+ ```ここに言語を入力
70
+ const char *p1 = "..."; // OK
71
+ char *p2 = "..." // Error(昔の本やコンパイラーの場合許可される場合もあるがこれはエラーです)
72
+ p1[0] = 'd'; // Error. 文字列はconst.
73
+ ```
74
+ ここまでは分かっていると思います。
75
+
76
+
77
+ マクロの中のCは文字コードとは関係ありませんがそれなりに重要な意味があります。
78
+ マクロの中のCの観点からみるとWinAPIやMFC関数の中で文字列を因数にするものは大体二つの種類があります。
79
+
80
+ 1. LPCTSTR, LPCWSTR, LPCSTRなど、Cがついたもの(例:CreateWindowEx)
81
+ 2. そうでないもの(LPTSTR, LPWSTR, LPSTRなど)(例:DrawTextEx)
82
+ がそれです。
83
+
84
+ 1の場合は因数の中身が変更されない
85
+ 2の場合は因数の中身が変更される可能性がある。
86
+ っていうことです。
87
+
88
+ 詳しく説明すると関数の因数でCがついたものたち(1類)は
89
+ ```ここに言語を入力
90
+ p1[0] = 'd';
91
+ ```
92
+ みたいな行動を**関数の中で絶対しない**っていういわゆる保障的なものです。
93
+ しかし、2類関数たちはそんな保証をしません。
94
+ なので因数の中身が変更される可能性がいつでもあります。
95
+
96
+ 最初に戻ってDrawTextExを見ますと
97
+ ```ここに言語を入力
98
+ int DrawTextEx(
99
+ _In_ HDC hdc,
100
+ _Inout_ LPTSTR lpchText,
101
+ _In_ int cchText,
102
+ _Inout_ LPRECT lprc,
103
+ _In_ UINT dwDTFormat,
104
+ _In_ LPDRAWTEXTPARAMS lpDTParams
105
+ );
106
+ ```
107
+ 2番目の因数が**LPTSTR**ですね。
108
+ なのでこの関数の中でlpchTextが指している内容が変更される(もしくは可能性がある)っていうことで、
109
+
110
+ ```ここに言語を入力
111
+ LPCTSTR p1 = _T("...");
112
+ LPTSTR p2 = new TCHAR[1024];
113
+ TCHAR arr[1024] = _T("...");
114
+
115
+ DrawTextEx(..., p1, ...); // Error: p1[0] = 'd';と全く同じコードになります。
116
+ DrawTextEx(..., p2, ...); // OK: newで作られたメモリーは書き込むことができます。
117
+ DrawTextEx(..., arr, ...); // OK: 配列は書き込むことができます。
118
+ ```
119
+
120
+ なんか長くなりましたが要すると
121
+ **1類関数には p1, p2, arrどちらでもいい。**
122
+ **2類関数には p1はできない。p2, arrはオッケー。**
123
+ って言うことです。

3

minor changes

2018/02/27 09:11

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -15,6 +15,7 @@
15
15
  strlen : Ansi用
16
16
   wcslen : Unicode用
17
17
   tcslen : strlenの T version.
18
+ 0. なるべくUnicode設定を使用する
18
19
 
19
20
  ---
20
21
 

2

minor changes

2018/02/27 02:05

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -7,8 +7,8 @@
7
7
 
8
8
  0. 文字列は_T()で囲む
9
9
  LPSTR x = "...";
10
-  LPSTR x = L"...";
10
+  LPWSTR x = L"...";
11
- LPSTR x = TEXT"...";
11
+ LPWSTR x = TEXT"...";
12
12
  → LPTSTR x = _T("...");
13
13
 
14
14
  0. strlenなどの標準C関数使用し注意

1

minor changes

2018/02/27 02:04

投稿

gazette2
gazette2

スコア179

answer CHANGED
@@ -6,7 +6,10 @@
6
6
  WCHAR, CHAR → TCHAR
7
7
 
8
8
  0. 文字列は_T()で囲む
9
+ LPSTR x = "...";
10
+  LPSTR x = L"...";
11
+ LPSTR x = TEXT"...";
9
- LPSTR x = "..."; → LPTSTR x = _T("...");
12
+ → LPTSTR x = _T("...");
10
13
 
11
14
  0. strlenなどの標準C関数使用し注意
12
15
  strlen : Ansi用