下記のソースをDebug版で実行すると値を取得することは可能なのですが、
Release版で実行すると取得できません。
ちなみに、win98で使用すると取得した値の後にゴミが入るようです。
(↑これは既に自分で解決したんですが)
どなたかわかる方、教えていただけないでしょうか。
開発環境:win2000, VC++6.0
char szBuf[256];
CEdit* pEd = (CEdit*)GetDlgItem( IDC_XXXX );
pEd->GetLine(NULL, szBuf);
>ちなみに、win98で使用すると取得した値の後にゴミが入るようです。
>(↑これは既に自分で解決したんですが)
んーと、自分で解決するというかMSDNをしっかり読みましょう。
CEdit::GetLineには
コピーされる行には、終わりを示す NULL 文字は含まれません。
と書いてあります。
Release版で取得できないのは、どこかでメモリ破壊などを起こしているからじゃないでしょうか。
他の部分がどうなっているかは分からないのでなんとも言えませんが。
ソースはあれだけです。
実験用にMFCダイアログベースで作成したもので、「OK」を押したらエディットボックスの
中身をメッセージボックスで表示するというだけです。
何かおわかりになるでしょうか。
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バイト以上のテキストがあったら全て取得できないですからね。
無事解決いたしました。
ありがとうございます。