Получить текст из элемента управления редактирования (Pure Win32 API) - PullRequest
3 голосов
/ 12 сентября 2011

Я пытался заставить это работать на протяжении многих лет, но безрезультатно (грустное лицо).

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;
}

Ответы [ 3 ]

7 голосов
/ 12 сентября 2011

Параметр wParam здесь неверен:

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

Вы должны передать len+1 из-за нулевого терминатора.

3 голосов
/ 12 сентября 2011

Вы освобождаете память перед возвратом !!!

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

Вы должны предоставить клиенту возможность освободиться, когда он больше не нужен ...

Надеюсь, это поможет!

2 голосов
/ 12 сентября 2011

Вы уже освобождаете память, на которую указывает pstrText, прежде чем вернуться. Вы должны вернуть строковый объект, который может содержать текст и автоматически освобождает его при выпуске. Или вам придется попросить вызывающую сторону выделить память для строки, но тогда вы просто оборачиваете API.

...