02. september 2004 - 00:07
Der er
9 kommentarer og 1 løsning
nogen der kan quick fikse den her (int, add 1 eller -1)
vidste ikke liige helt hvordan jeg skulle skrive min titel :P men altså, jeg har den her ting til min netværks system (beskrivelse nedenunder) ------------- void statusbarmsg(char * todo) { HKEY key; char* line0; int line1; char* line2; char* line3; char* line4; int alluser = 0; if (todo == "add") { alluser = alluser + 1; } if (todo == "remove") { alluser = alluser - 1; } if (todo = "init") { // do nothing. } // get max users online allowed from registry if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Server\\LoginServer", 0, KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) { DWORD size = 0; RegQueryValueEx(key, "MaxUsers", NULL, NULL, NULL, &size); BYTE *maxuser = (BYTE *)LocalAlloc(LMEM_ZEROINIT, size); if (RegQueryValueEx(key, "MaxUsers", NULL, NULL, maxuser, &size) == ERROR_SUCCESS) // put the status bar message together line0 = " Users Online: "; if(alluser == -1) { line1 = 0; } else { line1 = alluser; } line2 = "/"; line3 = (char*)maxuser; line4 = " (total/max)"; char* sbbuf = new char[strlen(line0)+sizeof(line1)+strlen(line2)+strlen(line3)+strlen(line4)]; sprintf(sbbuf,"%s%i%s%s%s",line0,line1,line2,line3,line4); // set the status bar message SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)sbbuf); LocalFree((HLOCAL)maxuser); } return; } ------------- det jeg gør er, jeg siger statusbarmsg("init") i min program opstart (virker fint, den skriver "users online 0/100" (100 er min value fra reg. når en så logger på og er acceptet siger jeg statusbarmsg("add") og logger af statusbarmsg("remove") den "skulle" så gerne skrive hvor mange der er på, men det gør den jo så ikke... den skriver 1 hvis der er 1 på, eller 40 på og 0 hvis en logger af... nogen der kan sige mig en (forhåbentlig) hurtig fix til det? takker.
Annonceindlæg fra Cepheo
02. september 2004 - 00:16
#1
1. Problem: Man kan ikke sammenligne indholdet af to char * med == (todo == "add"), brug strcmp(todo, "add") som er 0 hvis de to er ens.
02. september 2004 - 00:20
#2
2: Jeg tror ikke at udregningen for størrelsen for new [strlen(line0)+sizeof(line1)+strlen(line2)+strlen(line3)+strlen(line4)] er rigtig, det var måske lettere at bruge en std::sting eller std::stringstream. Det er specielt sizeof(line1) der er galt.
02. september 2004 - 00:20
#3
hum, det virker ellers fint, har ikke haft nogen problemer med det, men kan da godt lige rette det for en sikkerheds skyld
02. september 2004 - 00:23
#4
3: Jeg tror at du skal gemme alluser fra kald til kald.
02. september 2004 - 00:31
#5
4: Du mangler en delete [] på sbbuf
02. september 2004 - 15:19
#6
6: >>> if (RegQueryValueEx(key, "MaxUsers", NULL, NULL, maxuser, &size) == ERROR_SUCCESS) >>> >>> // put the status bar message together >>> line0 = " Users Online: "; ... >>> SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)sbbuf); De viste linier efter if(...) skal vel puttes ind i en blok Er registry værdien "MaxUsers" af typen String ? I så fald synes jeg den skulle være af typen DWORD. Det ville være lettere at bruge. (Keep It Simple) Ad 1: >>> if (todo = "init") er altid sand! Ad 2: sizeof(line1) er sådan cirka 4, dvs max 9999 users online En 32 bit int kan max fylde 11 tegn på tekstform (fortegn + 10 cifre) Ad 3: static int alluser = 0; if (strcmp(todo,"init") == 0) { alluser = 0; } løser problemet /db
02. september 2004 - 18:05
#7
okay prøver det lige.
02. september 2004 - 18:17
#8
det virkede sådan her : void statusbarmsg(char * todo) { HKEY key; char* line0; int line1; char* line2; char* line3; char* line4; static int currentuser; static int alluser; if (strcmp(todo,"add") == 0) { currentuser = alluser; alluser = currentuser + 1; } if (strcmp(todo,"remove") == 0) { currentuser = alluser; alluser = currentuser - 1; } if (strcmp(todo,"init") == 0) { alluser = 0; } // get max users online allowed from registry if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Server\\LoginServer", 0, KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) { DWORD size = 0; RegQueryValueEx(key, "MaxUsers", NULL, NULL, NULL, &size); BYTE *maxuser = (BYTE *)LocalAlloc(LMEM_ZEROINIT, size); if (RegQueryValueEx(key, "MaxUsers", NULL, NULL, maxuser, &size) == ERROR_SUCCESS) // put the status bar message together line0 = " Users Online: "; line1 = alluser; line2 = "/"; line3 = (char*)maxuser; line4 = " (total/max)"; char* sbbuf = new char[strlen(line0)+4+strlen(line2)+strlen(line3)+strlen(line4)]; sprintf(sbbuf,"%s%i%s%s%s",line0,line1,line2,line3,line4); // set the status bar message SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)sbbuf); LocalFree((HLOCAL)maxuser); } return; } dilleberg, dit svar virkede, så hvis du smider et svar et points'ne dine. tak.
02. september 2004 - 18:26
#9
Punkt 2 og 4 er stadig ikke fixet.
11. november 2005 - 13:40
#10
lukker
Kurser inden for grundlæggende programmering