GetPrivateProfileSection() immer nur erster Wert...



  • Ich bekomme mit GetPrivateProfileSection() immer nur den ersten Wert einer Kategorie meiner INI-Datei...

    CString MeinToolDlg::LeseIniKategorie(CString strDatei, CString strKategorie)
    {
    	// Aktuelles Verzeichnis
      char *direct = new char[500];
      int laenge = GetCurrentDirectory(499,direct);
      direct[laenge] = NULL;
    	CString strDirectory;
    	strDirectory.Format("%s",direct);
      delete []direct;
    
    	char cVersionsOrdner[500];
    
    	GetPrivateProfileSection(strKategorie,
    		cVersionsOrdner,
    		sizeof(cVersionsOrdner),
    		strDirectory + "\\" + strDatei);
    
    	return cVersionsOrdner;
    }
    

    Aufrufen tu ich die Funktion so:

    CString strIniRueckgabe = LeseIniKategorie("ServerVersionen.ini", "ServerVersionen");
    

    Was muss ich machen um alle Schlüssel und Werte der Kategorie "ServerVersionen" als Rückgabewert zu bekommen?

    Meine INI-Datei sieht folgendermaßen aus (auf 3 Einträge gekürzt):

    [ServerVersionen]
    BWM_JN=685.6
    HartmannTresore_MR=685.6
    Pfennig_HV=685.6
    

    Ziel ist, dass alle Schlüssel und Werte der Kategorie in zwei Spalten in ein List Control gepackt werden sollen.

    Danke für jede Hilfe 🙂



  • Nur so eine Vermutung:
    aus der MSDN:
    Rückgabewert von GetPrivateProfileSection:
    The buffer is filled with one or more null-terminated strings; the last string is followed by a second null character.
    Ich gehe mal davon aus, dass in deinem cVersionsOrdner zuersteinmal schon das richtige drin steht. Du gibst die Variable dann aber als CString zurück und die sind nun mal Null-terminiert, d.h. dann steht nur noch der erste Wert drin. Könnte evtl. klappen, wenn du den Rückgabewert in char änderst oder wenn du den Inhalt von cVersionsOrdner vorher aufdröselst und irgendwie anders zurück gibst. Möglicherweise hilft es auch schon, \0 in dem char durch irgendetwas anderes zu ersetzen, aber wie gesagt: ist nur so eine Vermutung.



  • So kriegst du sie alle:

    for (char *pOrdner = cVersionsOrdner;        // erst mal auf den ersten Text zeigen
              *pOrdner != 0;                     // Leerstring = Ende
              pOrdner += (lstrlen(pOrdner) + 1)) // um Stringlänge weitersetzen
    {
        // pOrdner zeigt jetzt auf einen String, der einen der Ordner enthält
    }
    


  • Danke, ich werde nachher mal versuchen das einzubauen. 🙂



  • Gut, das funktioniert soweit. 🙂
    Nur muss ich es noch hinbekommen, dass ich den pOrdner in der for()-Schleife in ein CString konvertieren kann, um mit den Funktionen CString::Find() usw. das Gleichheitszeichen herauszufiltern und den Schlüssel und den Wert in ein CStringArray zu schreiben...



  • Ich verstehe nicht, warum ich, wenn ich in der for()-Schleife versuche pOrdner in einen CString zu laden, ich wieder nur den ersten Wert bekomme... Meine jetzige Funktion schreibt 3x den gleichen Ordner in das List Control...

    void CMyToolDlg::IniServerVersionenInListe(void)
    {
    [...]
    
    	char cVersionsOrdner[500];
    	GetPrivateProfileSection("ServerVersionen",
    			cVersionsOrdner,
    			sizeof(cVersionsOrdner),
    			strDirectory + "\\" + "ServerVersionen.ini");
    
    	CString strVersionsOrdner;
    	CStringArray arr;
    
    	for (char *pOrdner = cVersionsOrdner;        // erst mal auf den ersten Text zeigen
    						*pOrdner != 0;                     // Leerstring = Ende
    						pOrdner += (lstrlen(pOrdner) + 1)) // um Stringlänge weitersetzen
    	{
    		strVersionsOrdner = pOrdner;
    
    		int old = 0, pos = 0;
    		while(-1 != (pos = strVersionsOrdner.Find('=', pos)))
    		{
    				arr.Add(strVersionsOrdner.Mid(old, pos - old));
    				old = ++pos;
    		} // while
    		if(old < strVersionsOrdner.GetLength())
    		{
    				arr.Add(strVersionsOrdner.Mid(old, strVersionsOrdner.GetLength() - old));
    		} // if
    		int nItem = m_ctlVersionen.GetItemCount();
    		m_ctlVersionen.InsertItem(nItem, arr[0], 0);
    		m_ctlVersionen.SetItemText(nItem, 1, arr[1]);
    	} // for
    } // Funktion
    

    Kann mir bitte jemand helfen? 🙂


Log in to reply