2011-09-12 13 views
2

私はこのような年齢のために働くように努力してきましたが、無駄(悲しい顔)はありません。編集コントロール(Pure Win32 API)からテキストを取得

int iChars = GetWindowTextLength (GetDlgItem(handle,ID))+1; // Room for '\0' 
char* pstrText; 
pstrText = (char*) malloc (sizeof(char)*iChars); 
if (pstrText != NULL) { 
    //GetWindowText (GetDlgItem(handle,ID), pstrText, iChars); 
     GetDlgItemText(handle,ID,pstrText,iChars); 
} 
return pstrText; // Memory gets freed after it returns 

の作業例:あなたが戻る前に、メモリを解放している

char* MWC::System::TextBox::GetText(){ 
    int len = SendMessage(handle, WM_GETTEXTLENGTH, 0, 0); 
    char* buffer = new char[len]; 
    SendMessage(handle, WM_GETTEXT, (WPARAM)len+1, (LPARAM)buffer); 
    return buffer; 
} 
+0

ポインタを再設定しても、メモリはまだ削除されますので、結果は引き続き削除されたメモリを指します。また、実行しているプラ​​フォームに応じて、ポインタのサイズは32/64ビットになります。関数GetDlgItemTextのFouthパラメータはiCharsでなければなりません。 – beren

+0

ええ、それは機能が正常に動作しない原因ではありません。 – Christian

+1

「うまくいきません」は私たちにとっては十分ではありません。どのように失敗するのですか?正確である。あなたの画面は見えません。 –

答えて

6

wParamパラメータは、ここで間違っている:あなたがあるため、ゼロターミネーターのlen+1を渡す必要があり

SendMessage(handle, WM_GETTEXT, (WPARAM)len, (LPARAM)buffer); 

+0

もう一度お返事ありがとうございました...^_ ^ – Christian

3

if ((pstrText != NULL) { 
    GetDlgItemText(handle,ID,pstrText,sizeof(pstrText)); 
    free (pstrText); // Freeing memory Here! 
} 

あなたは

は、この情報がお役に立てば幸いです...その必要なくなったときに、クライアントが解放しないための方法を提供する必要があります!

+0

ありがとうございました! pstrTextはローカル変数なので、関数の戻り後にそのメモリはクリアされるはずです(右?)。私はfree(pstrText)を削除しましたが、プログラムは何も返しません。 – Christian

+0

pstrTestはローカル変数です。変数は範囲外になると破棄されますが、メモリ上でfree()を呼び出すまでメモリは割り当てられたままです。メモリが不要になったときにメモリを解放する方法を見つけなければなりません。 – beren

+0

2番目の例はどうですか?それも何も戻っていない! – Christian

2

あなたが戻ってくる前にpstrTextで指されているメモリを解放してください。テキストを実際に含むことができる文字列オブジェクトを返し、解放時に自動的に解放する必要があります。または、呼び出し元に文字列のメモリを割り当てるように依頼する必要がありますが、APIをラッピングするだけです。

+0

注意していただきありがとうございます:P、問題は依然として続きますが! – Christian

+0

'pstrText'は、読み込み/表示/コピーした後に解放する必要があります(そうしないと、メモリリークが発生します)。私はあなたが進む前に、C/C++メモリの基礎を学ぶ方が良いと思う。 – demorge

+0

これは一時変数なので、関数が返ってからメモリが削除されます。 – Christian

関連する問題