[Winapi] Pobieranie wieloliniowego tekstu z kontrolki Edit
Ostatnio zmodyfikowano 2015-07-27 19:43
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 |
|
Monika90 |
» 2015-07-27 14:02:58 Alokowany bufor jest dwa razy za mały. |
|
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? |
|
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. |
|
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ł. : ) |
|
« 1 » |