• 締切済み

Windowsプログラミングでのテキスト保存について

Windowsプログラミングでのテキスト保存について エディットコントロールに入力された文字列を取得しGlobalAlloc関数などを使いメモリを確保し CreateFile関数、WriteFile関数を使ってテキストファイルを作成するプログラムを書いたのですが マルチバイト文字でコンパイルした場合とUnicode文字でコンパイルした場合とでファイルの中身の 表示結果が異なってしまいます。 例えば ナンバーは 12 34 56 78 です。 日付 00/00 00:00:00(改行)←1行目 ナンバーは 34 56 78 90 です。 日付 00/00 00:00:00(改行)←2行目 とエディットコントロールに入力されていたものをテキストファイルに書き込むと、 Unicode文字でコンパイルしたプログラムの場合 ナンバーは 12 34 56 78 です(改行)などと途中までしか書き込まれていなかったり あるいは2行中初めの1行しか書き込まれていなかったりします。 このプログラムをマルチバイト文字でコンパイルするとエディットコントロールに入力されたとおりに ファイルに書き込まれるようです。コンパイル時どちらも構文エラーはでません。 自分なりに文字の取得方法やメモリ関係やワイド文字関連の事情などをいろいろ試してみたのですが、いまだに解決していません。分かる人がいましたらどうか教えてください。お願いします。 ちなみにエディットコントロールは複数行入力スタイルでEM_SETSEL、EM_REPLACESELで追記されていく、出力のみ可能という設定です。

みんなの回答

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

ステップ実行などで、各場所で正しく取得できているか? とか確認された方がよいでしょう。 >WriteFile(hFile,lpszBuf,(DWORD)lstrlen(lpszBuf),&dwAccBytes,NULL); lstrlen()が返却するのは「TCHAR単位での文字数」ですが…。 http://msdn.microsoft.com/ja-jp/library/cc410906.aspx UNICODEで"書き込みテスト"をlstrlen()で取得すると、7「文字」となります。 対して、WriteFile()の第3引数は「書き込み対象のバイト数」です。 "書き込みテスト"から7バイト書き込んだら…正しくないですよね? http://msdn.microsoft.com/ja-jp/library/cc429856.aspx >hMem=GlobalAlloc(GHND,((sizeof(TCHAR))*(nLen)+2)); hMem=GlobalAlloc(GHND,(sizeof(TCHAR)*(nLen+1))); が妥当かと… # 後から見た時、"+2ってなに? 終端コード分なら+1じゃん。"と修正されて不具合盛り込む可能性があります。 >GetWindowText(hEdit1,lpszBuf,nLen+2); 確保したサイズより大きいサイズを渡しています。 # 事前にWM_GETTEXTLENGTHで取得して、終端コード分のメモリも取っているのでオーバーランはしないと思われますが…

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>エディットコントロールに入力された文字列を取得しGlobalAlloc関数などを使いメモリを確保し >CreateFile関数、WriteFile関数を使ってテキストファイルを作成するプログラムを書いたのですが 具体的にどういうコード書いていますか? UNICODE文字セットの場合、APIが返却するのは「文字数」ですが、そのヘン間違えていませんか? dwLength = GetWindowTextLength(hEdit); lpSitring = (LPSTR)GlobalAlloc(GPTR, dwLength + 1); GetWindowText(hEdit, lpSitring, dwLength); WirteFile(hTextFile, lpSitring, dwLength, NULL, NULL); って感じであれば、MBCSではちゃんと動くでしょうがUNICODEではちゃんと動きません。

sonicell39
質問者

補足

nLen=(SendMessage(hEdit1,WM_GETTEXTLENGTH,0,0)); hMem=GlobalAlloc(GHND,((sizeof(TCHAR))*(nLen)+2)); lpszBuf=(_TCHAR*)GlobalLock(hMem); GetWindowText(hEdit1,lpszBuf,nLen+2); OPENFILENAME構造体に必要情報をセット。 if(GetSaveFileName(&ofn)==0) return-1; hFile=CreateFile(szFile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(hFile,lpszBuf,(DWORD)lstrlen(lpszBuf),&dwAccBytes,NULL); ファイルハンドルを閉じメモリのロック解除と解放。というようなコードです。 私も以前文字列取得時のことを調べたのですが Unicodeの場合はバイト数ではなく文字数が返されるという情報がありました。 Unicodeに対応させたいと思いいろいろ試しているのですが、これまでうまくいっていないという 状況です。この場合Unicodeに対応させるにはどうすればいいのかどうか教えてください。 お願いします。

すると、全ての回答が全文表示されます。

関連するQ&A

このQ&Aのポイント
  • PCに詳しくない方でも理解しやすい方法で、PIXUS MX513プリンターのアイコンが表示されない問題について解説します。
  • PC上でドライバーの再インストールを行ってもPIXUS MX513プリンターのアイコンが表示されない場合、以下の方法を試してみてください。
  • パソコンのデスクトップ上でプリンターのアイコンが表示されない場合、アイコンの復活方法をご紹介します。
回答を見る