AssSoft Temat założony przez niniejszego użytkownika |
[WinApi][C++] konwersja LPSTR do string » 2014-02-09 16:20:01 Witajcie! Zauważyłem w prawdzie że taki temat już jest, ale problem nie został rozwiązany. W szachach które właśnie tworze ( pod drobnej przerwie ) chcę dać użytkownikowi możliwość wyboru imion dla siebie i przeciwnika. Imiona są w LPSTR, muszę je przenieść na string aby nimi operować. Na początek kilka kawałków kodu które nie działają poprawnie. string user_1; string user_2; LPSTR user_1L; LPSTR user_2L; string diag; LPCSTR diagL;
GetWindowText( hsname1, user_1L, NULL ); GetWindowText( hsname2, user_2L, NULL ); int dllen = strlen( user_1L ); user_1L[ ++dllen ] = NULL; dllen = strlen( user_2L ); user_2L[ ++dllen ] = NULL; user_1 = user_1L; user_2 = user_2L;
if( moveby == white ) { diag = "ruch "; diag += user_1; } if( moveby == black ) { diag = "ruch "; diag += user_2; } diagL = const_cast < char *>( diag.c_str() ); SetWindowText( hcomst, diagL );
Kompilator nie wywala błędu, ale komunikat wyświetla tylko "ruch" bez nazwy użytkownika Kod znajduje się w różnych miejscach programu, i jest ustawiony zgodnie z kolejnością wykonywania ( ale nie ustawienia w kodzie ). Za pomoc z góry dziękuje, liczę na szybką odpowiedź. |
|
Monika90 |
» 2014-02-09 18:05:33 NULL to nie jest znak, to jest pusty wskaźnik. Twój kod jest w ogóle pozbawiony sensu. Czy czytałeś dokumentację funkcji GetWindowText? Lepiej przeczytaj. |
|
AssSoft Temat założony przez niniejszego użytkownika |
» 2014-02-09 22:56:33 Przeczytałem dokumentacje i zauważyłem jeden błąd - Wpisałem NULL jako maksymalną długość wczytanego tekstu(zapewne myślałem że znaczy to nieokreśloną...). poprawiłem to, aczkolwiek dalej zmienne user_1L oraz user_2L są puste. Sprawdzałem za pomocą funkcji GetLastError() czy nie nastąpił błąd.
Podsumowując ten nieuporządkowany tekst, jeden błąd mniej ( za to dziękuję ), ale drugi dalej istnieje. Nie jestem pewny, ale zapewne występuje przy pobieraniu lub ustawianiu tekstu. Tak więc ponownie proszę o szybką pomoc. |
|
Monika90 |
» 2014-02-09 23:12:13 Drugim argumentem dla GetWindowText ma być adres bufora, którego rozmiar jest określony przez trzeci argument. Czy tak jest u ciebie? |
|
AssSoft Temat założony przez niniejszego użytkownika |
» 2014-02-10 09:03:08 GetWindowText( hsname1, user_1L, strlen( user_1L ) ); ] Dokładnie, podobnie wygląda drugi GetWindowText, tyle że tyczy się user_2L. jak dla mnie błąd musi być tutaj: user_1 = user_1L; user_2 = user_2L; Czyli w konwersji LPSTR na string. |
|
kill |
» 2014-02-11 01:06:02 LPSTR na string to raczej nie problem, zresztą, nie mógłbyś sprawdzić co jest w np user_1L?
Edit: Zresztą chyba wskazane by tu było chyba alokowanie pamięci... Rozmiar tekstu w oknie ściągnij sobie przez GetWindowTextLength(); Potem alokuj przez np użyj GlobalAlloc: np: LPSTR user_1L = ( LPSTR ) GlobalAlloc( GPTR, Dlugosc tekstu );
No i pamiętaj o zwolnieniu pamięci gdy już jej nie będziesz potrzebował przez np GlobalFree...
Edit2: To co wkleiłeś trochę później nie ma dalej sensu... tzn 3 argument...
|
|
AssSoft Temat założony przez niniejszego użytkownika |
» 2014-02-11 15:23:28 Wielkie dzięki za pomoc! Działa, fakt. Tu pojawia się moje ostatnie mini-pytanie. Czy jest jakiś sposób na uniknięcie kasowania wszystkiego co znajduje się po spacji? Aktualnie jeśli w polu jest np. 'gracz 1' to wczytuje się 'gracz'.
|
|
kill |
» 2014-02-11 16:25:39 Jesteś pewny że kasuje wszystko po spacji? Jeśli nie to poniższe myślę rozwiąże twój problem: Jeśli robiłeś to tak jak Ci napisałem to w daj w 2 argumencie: rozmiar tekstu +1 Po załadowaniu tekstu przez GetWindowText, na to pole(tzn na miejsce Rozmiar+1) daj '\0' i myślę że już będzie ok. |
|
« 1 » 2 |