[WinAPI] Pobieranie tekstu z Edita do bufora.

0

Cześć,

mam problem z pobraniem tekstu z edita do bufora. Kod wygląda tak i nie wiem czemu mi nie pobiera (przy debugowaniu przy "bufor" jest napisane bad_ptr ale nie wiem jak zrobić żeby było good_ptr :D):

#include <windows.h>

HWND button, edit;
LPSTR bufor;
DWORD size;

LRESULT CALLBACK MainEventProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
BOOL CALLBACK DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
	HWND hWnd;
	WNDCLASSEX wndClass;
	MSG msg;
	char class_name[] = "jakastamklasalfjlkasfas";

	ZeroMemory( &wndClass, sizeof( WNDCLASSEX ) );
	wndClass.cbSize = sizeof( WNDCLASSEX );
	wndClass.hbrBackground = ( HBRUSH ) COLOR_BTNSHADOW;
	wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
	wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	wndClass.lpszClassName = class_name;
	wndClass.lpfnWndProc = MainEventProc;
	wndClass.hInstance = hInstance;

	if( RegisterClassEx( &wndClass ) == 0 ) return false;

	hWnd = CreateWindowEx( NULL, class_name, "tytul sdf safsdfsad", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
						   800, 500, NULL, NULL, hInstance, NULL );

	button = CreateWindowEx( NULL, "BUTTON", "a", WS_CHILD | WS_VISIBLE, 0, 0, 100, 30, hWnd, NULL, hInstance, NULL );

	edit = CreateWindowEx( NULL, "EDIT", "efwefw", WS_CHILD | WS_VISIBLE, 100, 100, 100, 30, hWnd, NULL, hInstance, NULL );


	ShowWindow( hWnd, SW_SHOWNORMAL );
	UpdateWindow( hWnd );

	for(;;) {
		if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
			if( msg.message == WM_QUIT ) break;

			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
	}

	return msg.wParam;
}

LRESULT CALLBACK MainEventProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
	switch( uMsg ) {
		case WM_COMMAND :
			if( ( HWND ) lParam == button ) {
				size = GetWindowTextLength( edit );
				GetWindowText( edit, bufor, size );
				MessageBox( NULL, bufor, "ewrw", 0 );
			}
			break;
		case WM_DESTROY :
			PostQuitMessage( 0 );
			break;
	}
	return DefWindowProc( hWnd, uMsg, wParam, lParam );
}

Pozdrawiam i dzięki za pomoc.

0

zadziałało w taki sposób (ale nie wiem czemu):

dałem bufor jako std::string i w funkcji GetWindowText w drugim parametrze dałem (LPSTR)bufor.c_str(). I nie rozumiem dlaczego tak na około muszę to robić skoro drugi parametr to LPSTR i wtedy bufor też był LPSTR...?

0

Nie rób sobie jajcek..
LPSTR bufor to wskaźnik do bufora .
Ale w twoim przypadku brak pamięci z nim powiązanej .
Bufor powinien być tablicą statyczną lub dynamiczną a więc np.

char bufor[100] ; // lub stosując typy Win API TCHAR bufor[100] ;

lub

char*bufor = new char[rozmiar] ;

z std::string funkcja c_str() zwraca wskaźnik do wewnętrznego bufora obiektu (lub kopi danych
z wewnętrznego bufora) jest to rozwiązanie niepoprawne ...

0
jajcek napisał(a)

[...]dałem bufor jako std::string i w funkcji GetWindowText w drugim parametrze dałem (LPSTR)bufor.c_str(). I nie rozumiem[...]

omg, tak pod żadnym pozorem nie wolno!

jak GetWindowText to musisz pobrać jedynie do statycznego bufora (tablicy char [])

dlaczego tak nie wolno?

  • po 1, bo c_str() po zwraca stały wskaźnik (const char*), czyli teoretycznie do bufora, którego nie możesz modyfikować, a ty co robisz?
    -po 2, nie bez powodu nie możesz go modyfikować, bo do tego wolno ci jedynie użyć operatora= i pokrewnych metod, gdyż one modyfikują inne parametry w obiekcie tego tekstu (poza samym tekstem), przykładowo ustawiają jego długość, bo długość w obiekcie stringa jest trzymana jako pole zmiennej, czyli jak zrobisz to co zrobiłeś to zwróć uwagę, że metoda size() zwróci ci nadal 0, bo oficjalnie string nie ma tekstu w sobie (bo go nigdzie nie przypisałeś)

no, jakby się uprzeć to można bezpośrednio do stringa napisać, ale to trzeba by go wcześniej odpowiednio przygotować, ustawić odpowiednią długość ręcznie, itp. no i nie było by to zbyt eleganckie, bo teoretycznie nie można tego robić

także użyj tablicy znakowej

0

ok będę pamiętać ;)

dzejo napisał(a)

Nie rób sobie jajcek..

długo myślałem nad tym zdaniem :)

0

w takim razie ten kod jest niepoprawny (to jest ze strony http://darkcult.gamedev.pl/kursy/apifile.html)?

LPSTR Bufor;
DWORD dwRozmiar, dwZapisane;
HANDLE hPlik;

hPlik = CreateFile("test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if(hPlik == INVALID_HANDLE_VALUE)
{
 MessageBox(NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION);
 PostQuitMessage(0); //Zakończ program
}

dwRozmiar = GetWindowTextLength(hwnd);
if(dwRozmiar == 0)
{
 MessageBox(NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION);
 PostQuitMessage(0); //Zakończ program
}

Bufor = (LPSTR)GlobalAlloc(GPTR, dwRozmiar+1);
if(Bufor == NULL)
{
 MessageBox(NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION);
 PostQuitMessage(0); //Zakończ program
}
GetWindowText(hwnd, Bufor, dwRozmiar); //skopiuj do bufora tekst z jakiegoś okna
Bufor[dwRozmiar] = 0; //dodaj zero na końcu stringa

if(!WriteFile(hPlik, Bufor, dwRozmiar, &dwZapisane, NULL))
{
 MessageBox(NULL, "Błąd zapisu do pliku", "Dupa blada!", MB_ICONEXCLAMATION);
 PostQuitMessage(0); //Zakończ program
}

GlobalFree(Bufor); //Zwolnij bufor
CloseHandle(hPlik); //Zamknij plik
0

Jest OK.
Jest pobierana długość napisu przez :
dwRozmiar = GetWindowTextLength(hwnd);

A następnie przydzielona pamięć przez Win funkcję
Bufor = (LPSTR)GlobalAlloc(GPTR, dwRozmiar+1);
Potem pobranie tekstu ( Uwaga tekst jest pobierany i brak kończącego NULL ).

Wykończenie poprawnego C-string:
Bufor[dwRozmiar] = 0;
Oddanie pamięci Windowsowi , niech ma
GlobalFree(Bufor); //Zwolnij bufor

0

a niby czemu ma być niepoprawny, przecież tuta właśnie używana jest tablica znaków, alokowania dynamicznie
nie spojrzałem na twój kod, ale w drugim poście napisałeś że używasz std::string

w każdym razie powtórz lepiej temat na temat stringów w C, a C++

//
dobra zobaczyłem twój kod, ty nie alokujesz w ogóle pamięci na bufor, o czym dzejo ci napisał
zapoznaj się z tablicami dynamicznymi C++ i ich użyj, a twoje magiczne LPSTR to nic innego jak char*

1 użytkowników online, w tym zalogowanych: 0, gości: 1