listview



  • int RESOLV::resolv(PARS::RANGE *range)
    {
    	// diese variable dient dazu, dem aktuellen item die stelle im listview zuzuordnen
    	int l_count = 0;
    
    	if(start_wsa())
    		return 1;
    
    	else
    	{
    		FILE *target;
    
    		if((target = fopen("C:\\nsc.log", "w")) == NULL)
    			return 1;
    
    		else
    		{			
    			for(int i = range->start[0]; i <= range->end[0]; i++)
    			{
    				// das erste byte wird in ein int konvertiert
    				string _1 = convert_int(i);				
    
    				for(int j = range->start[1]; j <= range->end[1]; j++)
    				{
    					// das 2 byte wird in ein int konvertiert
    					string _2 = convert_int(j);
    
    					for(int k = range->start[2]; k <= range->end[2]; k++)
    					{
    						// das 3 byte wird in ein int konvertiert
    						string _3 = convert_int(k);
    						//UpdateWindow(hList);
    						for(int l = range->start[3]; l <= range->end[3]; l++)
    						{
    							// natürlich brauchen wir noch variablen 
    							// als erstes brauchen wir eine variable vom typ HOSTENT*
    							HOSTENT* host = NULL;
    							// das letzte byte wird in ein int konvertiert
    							string _4 = convert_int(l);
    							// hier kann jetzt die auflösung erfolgen
    							// ausserdem wird hier in die datei geschrieben und 
    							// die items werden in die liste hinzugefügt
    							// diese aufgaben das schreiben in die datei und das hinzufügen der items
    							// erfolgt alles in funktion damit diese funktion nicht noch größer wird
    							// wir brauchen noch 3 array vom typ char
    							char l_ip[16], l_hostname[100], l_resolv_ip[16];
    							// beginnen wir nun mit der der auflösung
    							// dafür haben wir 2 funktionen
    							// einmal forward_solv und backward_solv
    							// zu aller erst müssen wir eine ip adresse bilden
    							string ip_address = _1 + "." + _2 + "." + _3 + "." + _4;
    							// nun haben wir einen ip adresse jetzt lösen wir auf
    
    							// wenn die ip adresse nicht aufgelöst werden kann dann wird NULL zurückgegeben
    							if((host = backward_solv(ip_address)) == NULL)
    							{
    								// nun die ip adresse konnte nicht aufgelöst werden was machen wir denn nun?
    								// zuerst schreiben wir unser ergebnis in die datei
    								target = write_in_file(target, ip_address, "-", "-", true);
    								// nun müssen wir das ergebnis in die liste eintragen
    								// !!
    								// !! das hinzufügen der items in die liste steht noch aus
    								// !!
    								strcpy(l_ip, ip_address.c_str());
    								strcpy(l_hostname, "-");
    								strcpy(l_resolv_ip, "-");
    
    								ListView_InsertItemEx_(hDlg, hList, l_ip, l_hostname, l_resolv_ip, l_count, 0);
    							}
    							// wenn die auflösung erfolgreich war gehts hier weiter
    							else
    							{
    								// da die auflösung erfolgreich war müssen wir den host name in einer separaten variable speichern
    								string current_hostname = host->h_name;
    								// nun lösen wir vorwärtsauf
    								// um fehler zu vermeiden erstellen wir einfach noch eine variable des typs HOSTENT*
    								HOSTENT* h;
    
    								if((h = forward_solv(current_hostname)) == NULL)
    								{
    									// der hostname konnte nicht aufgelöst werden
    									// also schreiben wir unser ergebnis in die datei das fehlerhafte ergebnis
    									// wir haben die erste ip und einen hostname aber die andere ip fehlt uns noch also fehler
    									target = write_in_file(target, ip_address, current_hostname, "-", true);
    									// !!
    									// !! das hinzufügen der items in die liste steht noch aus
    									// !!
    									strcpy(l_ip, ip_address.c_str());
    									strcpy(l_hostname, current_hostname.c_str());
    									strcpy(l_resolv_ip, "-");
    
    									ListView_InsertItemEx_(hDlg, hList, l_ip, l_hostname, l_resolv_ip, l_count, 0);
    								}
    
    								else
    								{
    									// hier wird die aufgelöste ip gespeichert
    									string current_ip;
    									// wenn die vorwärtsauflösung gescheiter ist dann wird folgendes gemacht
    									in_addr inet;
    									// die ip adresse wird in die struktur geschrieben
    									inet.S_un.S_addr = *((unsigned long*)h->h_addr_list[0]);
    									// nun müssen wir die ip noch in ein char umkonvertieren
    									current_ip = inet_ntoa(inet);
    
    									// so wir haben jetzt alles
    									// jetzt muss nur noch einen überprüfung gemacht werden
    									// stimmt die anfangsip mit der aufgelösten ip überein?
    									// also dann überprüfen wir mal
    									if(ip_address == current_ip)
    									{
    										// wenn die ip adresse übereinstimmen dann wird folgendes gemacht
    										target = write_in_file(target, ip_address, current_hostname, current_ip, false);
    										// !!
    										// !! das hinzufügen der items in die liste steht noch aus
    										// !!	
    										strcpy(l_ip, ip_address.c_str());
    										strcpy(l_hostname, current_hostname.c_str());
    										strcpy(l_resolv_ip, current_ip.c_str());		
    
    										ListView_InsertItemEx_(hDlg, hList, l_ip, l_hostname, l_resolv_ip, l_count, 1);
    									}
    
    									else
    									{
    										// wenn jedoch die ip nicht übereinstimmt
    										target = write_in_file(target, ip_address, current_hostname, current_ip, true);
    										// !!
    										// !! das hinzufügen der items in die liste steht noch aus
    										// !!
    										strcpy(l_ip, ip_address.c_str());
    										strcpy(l_hostname, current_hostname.c_str());
    										strcpy(l_resolv_ip, current_ip.c_str());
    
    										ListView_InsertItemEx_(hDlg, hList, l_ip, l_hostname, l_resolv_ip, l_count, 0);
    									}									
    								}
    							}
    							l_count++;
    						}			
    						l_count++;
    					}
    					l_count++;
    				}
    				l_count++;
    			}
    		}
    		// nun müssen wir noch das file schließen
    		fclose(target);
    	}
    
    	return 0;
    }
    
    void RESOLV::ListView_InsertItemEx_(HWND hDlg, HWND hListViewCtrl, char *szSpalte0, char *szSpalte1, char *szSpalte2, int iPos, int iImage)
    {
    	LVITEM lvi;
    
    	ZeroMemory(&lvi, sizeof(lvi));
    
    	lvi.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; // Wir wollen TEXT und IMAGE angeben!
    	lvi.iItem      = iPos;
    	lvi.pszText    = szSpalte0;
    	lvi.iImage     = iImage;
    	lvi.cchTextMax = lstrlen(lvi.pszText);
    	ListView_InsertItem(hListViewCtrl, &lvi); // Einfügen!
    
    	lvi.mask       = LVIF_TEXT;
    	lvi.iSubItem   = 1;
    	lvi.pszText    = szSpalte1;
    	lvi.cchTextMax = lstrlen(lvi.pszText);
    	ListView_SetItem(hListViewCtrl, &lvi); // Text in die 2. Spalte einfügen!
    
    	lvi.mask       = LVIF_TEXT;
    	lvi.iSubItem   = 2;
    	lvi.pszText    = szSpalte2;
    	lvi.cchTextMax = lstrlen(lvi.pszText);
    	ListView_SetItem(hListViewCtrl, &lvi); // Text in die 3. Spalte einfügen!
    
    	MessageBox(0, szSpalte1, "host", MB_OK);
    }
    

    guten morgen,
    mein problem dreht sich um diese beiden funktionen:
    kleine einleitung:
    die resolv funktion, löst wie man unschwer erkennen kann, eine ip range auf.
    die innersten schleife rechnet das 4 byte einer ip adresse hoch die zweit innerste das 3 byte usw.
    alle ergebnisse ob nun erfolgreich oder nicht werden in die listview geschrieben. und beim hinzufügen liegt das problem, meiner meinung nach.
    kleines beispiel:
    ich hab ne range von 192.168.0.0 bis 192.168.1.255
    nach dem starten löst er erstmal von 192.168.0.0-255. nun schreibt er alles schön in die listview mit folgenden angaben. 1. generierte ip, 2. aufgelöster hostname und 3. die aufgelöste ip
    bei der range von 192.168.0.0-255 werden noch alle items in die listview eingetragen sei es zb der hostname oder wenn keiner existiert dann ein "-".
    nun das phänomen:
    hat die innerste schleife ihre arbeit getan dh 256 durchgänge durchlaufen, so
    fängt er mit dem 1 netz an 192.168.1.0-255
    ab diesem zeitpunkt wird die listview aber nur noch mit der generierten ip gefüllt sprich evtl aufgelöster hostname und aufgelöste ip werden nicht mehr angezeit noch nicht mal ein "-" wenn nichts existiert...
    ich hab mal eine messagebox in die ListView_InsertItemEx_ funktion eingebaut.
    die messagebox gibt mir immer den hostname aus. ist das programm bei der auflösung der 192.168.1.0-255 angelangt so erscheint mir immer ein hostname nur wird er einfach nicht in die listview eingetragen.
    deshalb suche ich hier um rat da ich keinen blassen schimmer habe woran es liegen könnte. ich bin für jede hilfe dankbar 🙂

    gruß xerxes



  • for(int j = 0; j < 2;  j++)
    {
        for(int i = 0; i < 500; i++)
        {
            string str;
            char a[4];
            stringstream foo;
            foo << i;
            foo >> str;
            strcpy(a, str.c_str());
    
            ListView_InsertItemEx(hList, a, "hostname", "resolv ip", count, 0);
            UpdateWindow(hList);
            count++;
        }
        count++;
    }
    

    so ich hab mir mal ne "testumgebung" gebaut die dieses problem analysieren soll. im obigen quellcode tritt der gleiche fehler auf wie im anderen programm. alle 500 einträge werden vollständig in die liste eingetragen also die ersten 500 einträge haben folgenden inhalt: 1. inhalt von a 2.hostname und 3. resolv ip

    bei den nächsten 500 einträgen wie gesagt wird nur der inhalt von a ausgegeben mehr nicht. komische sache vielleicht habt ihr ja ne ahnung
    kann es sein das mein die liste irgendwie refreshen muss wie beim stringstream clear() damit man es wieder benutzen kann?
    gruß xerxes



  • Du zählst count falsch hoch. IMHO dürfte das nur in der innersten Schleife passieren. Das Resultat ist, dass lvi.iItem nicht mehr mit dem neuen Index übereinstimmt. Von da an greifst du auf den Index eines noch nicht eingefügten Items zu. Der tatsächliche Index des eingefügten Items steht im Rückgabewert von ListView_InsertItem. Diesen Wert musst du für die weiteren Operationen benutzen.



  • hi
    also ListView_InsertItem gibt mir die neue position zurück als int wert zurück?



  • int ListView_InsertItem(
        HWND hwnd,
        const LPLVITEM pitem
    );
    

    Returns the index of the new item if successful, or -1 otherwise.



  • xerxes_ schrieb:

    also ListView_InsertItem gibt mir die neue position zurück als int wert zurück?

    Das hab ich geschrieben, das steht in der MSDN Library und das hättest Du auch durch Ausprobieren/Debuggen rausfinden können. Wozu noch die Frage?



  • auf die msdn bin ich nicht gekommen, das ich den code zum hinzufügen von listview items aus einem tutorial habe sprich copy&paste. deshalb dachte ich, der code würde funktionieren...und ListView_InsertItem liefert keinen wert zurück.
    nur mein statement dazu.

    was mir noch einfällt, wie kann die ganze liste löschen? dh alle items entfernen?



  • xerxes_ schrieb:

    was mir noch einfällt, wie kann die ganze liste löschen? dh alle items entfernen?

    Auch hier hilft die MSDN Library. Wenn Du Dir dort mal alle Funktionen ansiehst, die mit ListView_ anfangen, findest du eine, die ListView_DeleteAllItems heißt 😉


Anmelden zum Antworten