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

回答編集履歴

1

問題のある部分を追記

2018/05/30 15:59

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -25,15 +25,15 @@
25
25
  > あとコード上で使い方がおかしいものがあったらご指摘ください。
26
26
 
27
27
  そうですね、気がついたものとしては
28
-
29
28
  * `HANDLE file`や`LPWSTR lpszbuf`がグローバル変数である必然性が無い。
30
29
  * `LPTSTR`(TCHAR配列のポインター)と`LPWSTR`(WCHAR/wchar_t配列のポインター)の意識が混在している。※`TCHAR`はマルチバイト(_MBCS)とUNICODE(_UNICODE)の双方で同じコードで書くためのものです。
31
30
  * `ReadFile` の返り値は`BOOL` なので、 実行結果の判定として `!= 0`は不適切。
32
31
  * `GlobalAlloc(GHND...)`~`GlobalLock`~ `GlobakUnlock`~`GlobaFree` の一連の流れは作法としては正しいのですが、短期間であるならば、Cランタイムの`malloc`~`free`で充分かと思います。`GHND`フラグ(`GMEM_MOVEABLE|GMEM_ZEROINIT`)を指定した`GlobalAlloc`の使用は、昔、PCのメモリが少なかった頃に有用だったもので、現在のPC+普通のアプリケーションで厳密に使い分けるほどに有用なものでもありません。
33
32
 
34
- あと、大きな問題がある部分としては
33
+ あと、問題がある部分としては
35
34
  * `GlobalAlloc`で取得したhMemoryが`NULL`であった場合でも、処理を続行している。
36
35
  * `ReadFile`実行後、`lpszbuf[accbytes] = '\0';` でNULL文字を埋め込んでいるが、`lpszbuf`は`wchar_t`型のポインターなので、実際に読み込んだバイト長 * 2 の位置に`'\0'`を挿入してしまっている。(メモリを破壊している) また、`L'\0'` との表記の方がより適切。
36
+ * `cout`を使う部分ですが、`cout` では`L`で指定したワイド文字列(UNICODE)は出力できないです。`wcout` を使う必要があります。
37
37
 
38
38
  ---
39
- と言ったところしょうか
39
+