GetLineについて – プログラミング – Home

通知
すべてクリア

[解決済] GetLineについて


mame
 mame
(@mame)
ゲスト
結合: 24年前
投稿: 5
Topic starter  

下記のソースをDebug版で実行すると値を取得することは可能なのですが、
Release版で実行すると取得できません。
ちなみに、win98で使用すると取得した値の後にゴミが入るようです。
(↑これは既に自分で解決したんですが)
どなたかわかる方、教えていただけないでしょうか。

開発環境:win2000, VC++6.0
char szBuf[256];
CEdit* pEd = (CEdit*)GetDlgItem( IDC_XXXX );
pEd->GetLine(NULL, szBuf);


引用未解決
トピックタグ
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

>ちなみに、win98で使用すると取得した値の後にゴミが入るようです。
>(↑これは既に自分で解決したんですが)
んーと、自分で解決するというかMSDNをしっかり読みましょう。

CEdit::GetLineには

 コピーされる行には、終わりを示す NULL 文字は含まれません。

と書いてあります。

Release版で取得できないのは、どこかでメモリ破壊などを起こしているからじゃないでしょうか。
他の部分がどうなっているかは分からないのでなんとも言えませんが。


返信引用
mame
 mame
(@mame)
ゲスト
結合: 24年前
投稿: 5
Topic starter  

ソースはあれだけです。
実験用にMFCダイアログベースで作成したもので、「OK」を押したらエディットボックスの
中身をメッセージボックスで表示するというだけです。
何かおわかりになるでしょうか。


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

MSDNをよく読みましょう。
そういう自分も使ったことなかったので初めて知りましたが...。

----------------
CEdit::GetLine
int GetLine( int nIndex, LPTSTR lpszBuffer ) const;
int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;

nMaxLength
  バッファにコピーできる最大バイト数を指定します。GetLine 関数は、Windows を呼び出す前に、
  この値を lpszBuffer で示されるバッファの最初のワードに置きます。
----------------

とあります。また、EM_GETLINEを見てみると、

----------------
EM_GETLINE
lParam = (LPARAM) (LPCSTR) lpch; /* バッファのアドレス */
lpch  行内容のコピーを受け取るバッファを指すポインタです。バッファの最初のワードは、 バッファに
    コピーできる最大文字数を示します。
----------------

とあります。
リリース版ではバッファがクリアされて、「バッファの最初のワード」が0になり「0バイト」しか取得
できないのでしょう。

まあ、要するに

  char szBuf[256];
  CEdit* pEd = (CEdit*)GetDlgItem( IDC_EDITXXXX );
  int iSize = pEd->GetLine(0, szBuf, sizeof(szBuf) - 1);
  szBuf[iSize] = '\0';

が正解なんでしょうね。もしくは

  *(LPWORD)szBuf = (WORD)sizeof(szBuf) - 1;
  pEd->GetLine(0, szBuf);

というより、取得する前にCEdit::LineLength でサイズを調べて動的に確保するのがベターだとは思います。
256バイト以上のテキストがあったら全て取得できないですからね。


返信引用
mame
 mame
(@mame)
ゲスト
結合: 24年前
投稿: 5
Topic starter  

無事解決いたしました。
ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました