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

[WinApi][C++] konwersja LPSTR do string

Ostatnio zmodyfikowano 2014-02-11 19:40
Autor Wiadomość
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.

C/C++
// zmienne
string user_1;
string user_2;
LPSTR user_1L;
LPSTR user_2L;
string diag;
LPCSTR diagL;

// pobieranie nazw i konwersja
GetWindowText( hsname1, user_1L, NULL );
GetWindowText( hsname2, user_2L, NULL );
int dllen = strlen( user_1L );
user_1L[ ++dllen ] = NULL; // ustawienie znaku NULL na końcu - nie jestem pewien czy dzieje się to samoczynnie
dllen = strlen( user_2L );
user_2L[ ++dllen ] = NULL;
user_1 = user_1L;
user_2 = user_2L;

// pokazywanie na ekranie
if( moveby == white ) // ruch wykona gracz 2
{
    diag = "ruch ";
    diag += user_1;
}
if( moveby == black ) // ruch wykona gracz 2
{
    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ź.


P-104318
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.
P-104326
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.
P-104357
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?
P-104359
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:
C/C++
user_1 = user_1L;
user_2 = user_2L;
Czyli w konwersji LPSTR na string.
P-104362
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...

P-104410
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'.

P-104446
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.
P-104452
« 1 » 2
  Strona 1 z 2 Następna strona