EnumWindows titel wird falsch übergeben (Vector)



  • Hallo zusammen,

    ich stehe derzeit vor folgendem Problem:

    mit dem unten gepostetem Code möchte ich alle Fenster die EnumWindows findet, in eine Vector liste übertragen (da die Größe nicht fix ist, bin ich gezwungen den Vector zu benutzen..).

    Jedoch füllt der push_back den Vector mit leeren Zeichenfolgen auf (oder Sonderzeichen, hängt von buf-Größe ab).. dennoch ist der buf string eigentlich nicht leer (siehe cout<<buf<<endl)..

    Wie kann ich die Übergabe dieser leeren Zeichenfolgen verhindern, bzw. den Fenstertitel korrekt in den Vector einfügen ?

    Danke im Voraus

    mcOocr ~

    vector<char*> list;
    BOOL CALLBACK EnumWindows(HWND hWnd, LPARAM lParam) {
    	if(IsWindowVisible(hWnd)&&GetParent(hWnd) == NULL) {
    	   	char buf[50];
    	   	GetWindowText(hWnd, buf, 50);
    	 	if(strlen(buf) != NULL)
    	 		cout<<buf<<endl;
    	 		list.push_back(buf);
    	} return true;
    }
    
    int main(int argc, char* argv[])
    {
    	int i;
    	EnumWindows(EnumWindows, NULL);
    	for(i=0; i<list.size(); i++) 
    		cout<<list[i]<<endl;	
    	system("PAUSE");
    	return 0;
    }
    


  • Dein vector speichert Zeiger auf Zeichenketten. Zeichenketten, die nach Verlassen des if Blocks nicht mehr existieren.
    Entweder du forderst für die Zeichenketten dynamisch Speicher an, statt

    char buf[50];
    
    char* buf = new char[50]
    

    und löschst am ende alle Zeichenketten über die Zeiger im vector

    delete list[i];
    

    Oder du machst es besser und speicherst std::strings im vector.

    std::vector<std::string> list;
    list.push_back(buf);
    

    list ist übrigens ein blöder Name (std::list).



  • buf ist nur im Scope der Funktion EnumWindows(..) gültig.
    Du speicherst in list eine Adresse, auf nicht mehr gültigen Speicher.

    Am einfachsten benutzt Du einfach std::string um Strings zu speichern.

    #include <string>
    #include <vector>
    
    // ...
    
    using namespace std;
    
    vector<std::string> list;
    
    // ...
    
    BOOL CALLBACK EnumWindows(HWND hWnd, LPARAM lParam)
    {
       // ...
    
       list.push_back(std::string(buf));
    
       // ...
    }
    

    BTW:
    - Den Return Wert von strlen(..) gibt keinen Zeiger zurück. NULL ist daher nicht angebracht.
    - Ausserdem würde ich die Callback Funktion nicht EnumWindows(..) nennen, das ist verwirrend. Nenn sie z.B. EnumWindowsCallback(..) oder ähnlich.



  • Danke für die schnellen Antworten, hat geholfen. 👍


Anmelden zum Antworten