.exe-Pfad herausfinden



  • wieso nimmste std::vector <wchar_t> und nicht gleich std::wstring? Oo

    bb



  • unskilled schrieb:

    wieso nimmste std::vector <wchar_t> und nicht gleich std::wstring? Oo

    wegen der speicher-am-stück-sei-garantie für begin()-end(), nehme ich an.



  • volkard schrieb:

    unskilled schrieb:

    wieso nimmste std::vector <wchar_t> und nicht gleich std::wstring? Oo

    wegen der speicher-am-stück-sei-garantie für begin()-end(), nehme ich an.

    Hmm.... ok ^^ schon mal ne string-implementation gesehen, wo das nicht der fall war? 😛
    ich weiß, der standard garantiert das nicht - aber es liegt imho auf der hand...

    bb



  • Das Current oder Working Directory muss nicht der Pfad sien in dem deine exe liegt. Da ist GetModuleFileName schon das richtige. Aber was willst du überhaupt machen? Userdaten gehören nicht da hin.



  • Naja, also mein Programm muss auf jeden Fall, wenn man damit arbeitet bestimmte Ordnerstrukturen erstellen. Diese Struktur ist aber abhängig von den Eingaben des Benutzers. Ich möchte, dass diese Ordnersstrukturen und auch Dateien innerhalb des Ordners der .exe Datei angelegt werden bzw. in einem Ordner, der in dem Ordner, wo die .exe Datei liegt, bereits existiert.

    Ich habe gestern 2 Stunden dran rumprobiert und bin nicht wirklich weiter gekommen.



  • So hab das jetzt soweit. Jetzt habe ich allerdings ein neues Problem:

    Ich kann mit CreateDirectory() und einem char* keinen Ordner erstellen.

    Ich müsste meinen Pfad in LPWCSTR umwandeln, was mir allerdings nicht gelingt.

    unsigned short S = GetCurrentDirectory(0, NULL);
    	S += 16;
    
    	char *Filename =new char[2*S];
        GetModuleFileName(NULL, (LPWCH)Filename, 2*S);
        string NAME;
    	cout <<"Geben sie bitte den Namen des Ordners ein: ";
    	cin >>NAME;
    
    	char *path = new char [110];
    	for(int i = 0; i <= S-11;i++)
    		path[i] = Filename[2*i];
    	for(int i = S-10; i <= S - 11 + NAME.length(); i++)
    		path[i] = NAME[i-(S-10)];
    
        for(int i = 0; i <= S - 11 + NAME.length(); i++)
    		cout <<path[i];
    
    	CreateDirectory((LPCWSTR)????, NULL);
    


  • Nimm vielleicht mal wchar_t statt char - denn LPCWSTR erwartet einen Wide-String.

    P.S. Gibst du den mit new angeforderten Speicherbereich wieder irgendwo frei?



  • So wie ich das sehe, ändert das aber nicht daran, dass ich trotzdem eine Umwandlung durchführen muss, denn Benutzereingaben kann ich dann ja nicht in wchar_t speichern, oder?

    btw.: Was soll das eigentlich, dass man zehn verschiedene Zeichen-Datentypen verwendet, anstatt sich mal auf eine zu einigen?

    Den Speicher, den ich anfordere gebe ich an späterer Stelle wieder frei.



  • stell dein Projekt auf Multibyte statt Unicode und du kannst mit char arbeiten, ansonsten ist wchar_t was du brauchst.
    folgendes:
    LPSTR = char*
    LPWSTR = wchar_t*
    LPCSTR = char const*
    LPCWSTR = wchar_t const*

    wann immer in der WINAPI steht LPTSTR oder LPCTSTR duerfte das glaub ich bedeuten, dass je nach Projekteinstellung(Unicode/Multibyte) die char oder wchar_t Varianten genommen werden.

    anstatt den dynamischen Arrays kannst du auch vectoren verwenden, da &vector[0] garantiert ein normales, passendes Array zurueckgibt(afaik als einziger Container) und dann kannst du dir das delete[] sparen(und hast ausserdem noch weitere Vorteile, wenn du es auch an anderer Stelle verwendest).

    wenn du einen wstring hast, und daraus ein vector<wchar_t> machen willst, geht das folgendermassen:
    vector<wchar_t> wstr(str.begin(), str.end());
    andersrum genau so.
    mit einem string duerfte das auch funktionieren, koenntest aber evtl. Probleme kriegen, da dabei nicht die Kodierung konvertiert wird, sondern einfach der Wert gecastet wird - solltest du die Konsole verwenden wollen, nimm einfach kein Unicodeprojekt.
    Das ganze geht mit vector<char> natuerlich genau so!



  • Also wenn ich mein Projekt auf Multibyte umstelle, dann würde folgendes gehen?

    char *file...;
    CreateDirectory(file,NULL);
    

    Ich versteh das nicht so ganz....der DAtentyp einer Funktion ändert sich doch nicht wegen einer Projekteinstellung. Oder wird eine andere Überladung verwendet?

    Wo stele ich denn auf Multibyte um?



  • die Projekteinstellung setzt ein define, _UNICODE oder UNICODE, wodurch die Typen der WINAPI (TCHAR, LPTSTR, LPCTSTR u.s.w.) entsprechend veraendern



  • Ah...danke...habs gefunden...So dann werd ich mal schaun, was ich verändern muss.

    Edit: So hab jetzt alles geändert. Das Speichern funktioniert wunderbar und das Übergebend er Argumente an CreateDirectory() auch.

    Das einzige Problem besteht jetzt nur noch darin, dass CreateDirectory kein Verzeichnis erstellt.

    unsigned short S = GetCurrentDirectory(0, NULL);
    	string NAME;
    	cout <<"Geben sie bitte den Namen des Ordners ein: ";
    	cin >>NAME;
    
    	//Verzeichnis speichern
    	char *Filename =new char[S];
        GetModuleFileName(NULL, Filename, S);
    
        //Name des neuen Ordners dem Pfad hinzufügen
    	S += NAME.length();
    	char *path =new char[S];
    	for(int i = 0;i < S-NAME.length();i++)
    		path[i] = Filename[i];
        for(int i = S-NAME.length(); i < S; i++)
    		path[i] = NAME[i-(S-NAME.length())];
    	//"\" Entfernen 
    	for(int i = 0; i < S; i++)
    		if(path[i] == '\\')
    			path[i] = '/';
    
        //Pfad ausgeben
    	for(int i = 0; i <= S - 1;i++)
    		cout <<path[i];
    
    	//Neuen Ordner Erstellen
    	CreateDirectory(path, NULL);
    

    Wenn ich anstatt der Zeigers path "c:/Test" als Pfad übergebe, dann erstellt Create Directory den Pfad ohne Probleme.

    Edit: Habs hinbekommen, habe nur vergessen dem char array "path" ein '\0' am Ende anzufügen. 🙂


Anmelden zum Antworten