Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Winapi] Pobieranie wieloliniowego tekstu z kontrolki Edit

Ostatnio zmodyfikowano 2015-07-27 19:43
Autor Wiadomość
Mentaris
Temat założony przez niniejszego użytkownika
[Winapi] Pobieranie wieloliniowego tekstu z kontrolki Edit
» 2015-07-27 13:56:47
Witam, natknąłem się na strasznie złośliwego buga, w którym nie potrafię znaleźć przyczyny. Stworzyłem coś takiego:


case WM_LBUTTONDOWN:
{
ShowWindow(hdlgwindow, SW_HIDE);
SendMessage(hdlgwindow, WM_COMMAND, ID_DescriptionEdit,NULL);
}
// wciskam klawisz myszy ukrywa mi okno i wysyła komunikat do kodu niżej

case ID_DescriptionEdit:
{
int length = GetWindowTextLength(hedit);
var.Text = (LPWSTR)GlobalAlloc(GPTR, length + 1);
GetWindowText(hedit, var.Text, length +1);
break;
}
// tu pobrałem sobie tekst z edita kodem z waszej stronki do zmiennej var.Text która ma typ LPWSTR ponieważ konfiguracja IDE jest ustawiona na unicode.
A gdy zaznaczam inną kontrolke otwiera sie okno edita i wypisuje sie na edita tekst setwindowtext var.Text uprzednio czyszcząc edita z textu (TEXT("")).
i wszystko jest spoko dopóki  wpisuje tylko jedną linie textu np  Ala ma kota
Jednak gdy wpisze tekst na parę lini, albo powbijam parę enterów i wpisze tekst wyskakuje mi:

"Critical error detected c0000374"

To jest chyba kod za uszkodzenie pamięci albo przepełnienie, coś w tym stylu co nie?
Próbowałem więc dać globalfree(var.Text) przed int length ale wylatuje mi błąd:

"HEAP[.exe]: Heap block at 00426AB8 modified at 00426AC6 past requested size of 6"

Może ktoś z was wie dlaczego może coś takiego się dziać? Jak to naprawić? Jak żyć?
IDE MVS 2013 Ultimate
P-135290
Monika90
» 2015-07-27 14:02:58
Alokowany bufor jest dwa razy za mały.
P-135291
Mentaris
Temat założony przez niniejszego użytkownika
» 2015-07-27 15:44:41
Sprawa załatwiona, odliczyłem ilość znaków którą można wpisać w edita i wstawiłem ją jako ilość alokowanych bitów(tak to sie nazywa prawda? Allocate Bytes). jednak nie rozumiem dlaczego w tutku jest LPSTR który nie ma wpisanej wielkości, rozumiem że na starszych IDE wprowadzała się jakaś duża ilość bitów domyślnie?
P-135297
Monika90
» 2015-07-27 18:45:03
W tutku jest LPSTR, bo tutek używa kodowania ANSI, a nie UNICODE. Gdy używasz unikodu, to musisz alokować dwa razy więcej bajtów niż jest słów kodowych w tekście (wliczając w to końcowe zero), gdyż słowo kodowe (code unit) UTF-16 zajmuje dwa bajty.
P-135302
Mentaris
Temat założony przez niniejszego użytkownika
» 2015-07-27 19:43:55
Teraz rozumiem dlaczego długość pobrana z okna nie mogła stać się wielkością dla LPWSTR.. nie miałem pojęcia że tak może być. Dzięki Monika! Bez ciebie to ja nie wiem co bym zrobił. : )
P-135305
« 1 »
  Strona 1 z 1