Konsolenprogramm läuft, selbes Programm mit "GUI" nicht



  • Hm, ja da bin ich mal wieder. Es geht mal wieder um Dateioperationen - diesesmal aber mit "GUI".

    Folgendes Beispiel kann ich wunderbar als Konsolenprogramm im Dev-CPP kompilieren:

    #include <cstdlib>
    #include <dirent.h>
    #include <iostream>
    #include <string>  //für std::string
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        DIR *hdir;
        struct dirent *entry;
           hdir = opendir("./rename");
        chdir("./rename");
    
        cout << "Erfolgreich ins Verzeichnis gewechselt..." << endl;
    
        do
        {
            entry = readdir(hdir);
            if (entry)
            {
                cout << entry->d_name << endl;
                string a,b;
                a = entry->d_name;
                b = entry->d_name+4;
                cout << b << endl;
                rename(a.c_str(),b.c_str());
            }
        } while (entry);
        closedir(hdir);
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Nun dachte ich mir, ich versuche mich mal an einer kleinen GUI. Also versuchte ich es via M$ Visual C++ (2005) umzusetzten. Aber er kompiliert die Anweisungen im onClick nicht.

    hier mal die entsprechenden Codezeilen:

    #include "stdafx.h"
    #include "Rename2.h"
    #include "Rename2Dlg.h"
    #include <dirent>
    #include <cstdlib> 
    #include <iostream> 
    #include <string>  //für std::string 
    
    [gekürzt]
    
    void CRename2Dlg::OnBnClickedRename()
    {	
        DIR *hdir; 
        struct dirent *entry; 
    
        hdir = opendir("k:/test"); 
        chdir("k:/test");
        do 
        { 
            entry = readdir(hdir); 
            if (entry) 
            { 
                string a,b; 
                a = entry->d_name; 
                b = entry->d_name+4; 
                rename(a.c_str(),b.c_str()); 
            } 
        } while (entry); 
        closedir(hdir); 
    }
    

    Die Fehlermeldungen sind diese (sie sagen mir leider garnichts :():

    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(198) : error C2065: 'DIR' : undeclared identifier
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(198) : error C2065: 'hdir' : undeclared identifier
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(201) : error C3861: 'opendir': identifier not found
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(202) : error C3861: 'chdir': identifier not found
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(205) : error C3861: 'readdir': identifier not found
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2065: 'string' : undeclared identifier
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2146: syntax error : missing ';' before identifier 'a'
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2065: 'a' : undeclared identifier
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2065: 'b' : undeclared identifier
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(209) : error C2027: use of undefined type 'CRename2Dlg::OnBnClickedRename::dirent'
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(199) : see declaration of 'CRename2Dlg::OnBnClickedRename::dirent'
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(209) : error C2227: left of '->d_name' must point to class/struct/union/generic type
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(210) : error C2027: use of undefined type 'CRename2Dlg::OnBnClickedRename::dirent'
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(199) : see declaration of 'CRename2Dlg::OnBnClickedRename::dirent'
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(210) : error C2227: left of '->d_name' must point to class/struct/union/generic type
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(211) : error C2228: left of '.c_str' must have class/struct/union
    type is ''unknown-type''
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(211) : error C2228: left of '.c_str' must have class/struct/union
    type is ''unknown-type''
    c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(214) : error C3861: 'closedir': identifier not found
    Build log was saved at "file://c:\Dokumente und Einstellungen\dragosani\Eigene Dateien\Visual Studio 2005\Projects\Rename2\Rename2\Debug\BuildLog.htm"
    Rename2 - 16 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

    Könnt ihr damit etwas anfangen?



  • jo der findet die Funktionen nicht ... und wenn du schon unter MFC was machst ... dann nutzt doch auch die Windows File/Directory Funktionen ...



  • Und welche wären dies? Falls es aus den Beispielen nicht ersichtlich ist: ich bin ein sog. "bloody noob".

    Aber trotzdem verstehe ich nicht, wieso diese Funktionen auf einmal nicht mehr gehen sollen?



  • Hab gerade mal nachgeguckt ... den Header dirent sollte es garnicht geben. Müsste eigentlich ein UNIX-Header sein.

    Also guck dir mal http://msdn2.microsoft.com/en-us/library/aa363879.aspx an ...



  • Hm, kann sein, ich bin mir gerade nicht ganz sicher, ob ich den Header nicht aus dem MingW kopiert habe (probiere damit schon recht lange herum).

    Wenn ich Deinen Link richtig verstehe, dann müßte MoveFile() ja genau das sein, was ich brauche, oder?

    Sprich ich würde dann MoveFile(alterName, neuerName) aufrufen, oder? Wie kann ich dort dann die ersten 4 Zeichen weglassen?



  • Naja geh halt mit FindFirstFile usw durch ... und du kannst entweder die Klasse CString ... oder std::string oder char nutzen ... kommt drauf an ... C++ wäre CString und std::string ...



  • Also irgendetwas verstehe ich anscheinend grundlegend noch nicht. Ich habe jetzt Testhalber mal geschrieben:

    void CRename2Dlg::OnBnClickedRename()
    {
    	MoveFile("K:\\test\\1.mp3","K:\\test\\2.mp3");
    
    }
    

    Und natürlich oben <windows.h> inkludiert. Nur bekomme ich jetzt folgenden Fehler:

    error C2664: 'MoveFileW' : cannot convert parameter 1 from 'const char [14]' to 'LPCWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    Wenn ich mir aber einige Beispiele im Netz ansehe, dann soll es doch genau so gehen 😕

    Beispiel:http://www.online-tutorials.net/daten-ordner/dateien-ordner-kopieren-umbennenen/sourcecodes-t-16-11.html um nur eines zu nennen.



  • Hmm ja du hast wohl UNICODE aktiviert ...

    MoveFile(TEXT("K:\\test\\1.mp3"), TEXT("K:\\test\\2.mp3"));
    

    ...



  • 😮 Ganz genau so klappt es! Jetzt probiere ich weiter mit den Strings herum.

    Vielen Dank !

    PS: Wie kann ich denn die UNICODE abstellen? Wäre ja schon ganz nett, wenn es ohne TEXT() ginge 🙂



  • Guck mal in den Projekteinstellungen ... ist halt der Zeichensatz .. (Charset)


Anmelden zum Antworten