Variable für Windows System- und Programmordner



  • Hi,

    ich bin noch relativ frisch was C++ angeht, habe bisher jedoch für jedes Problem, das ich hatte, eine Antwort gefunden. Im folgenden Fall leider nicht. Ich will mir ein kleines Programm schreiben, das im Windows-Systemordner nach einer Datei sucht. Wenn diese bestimmte Datei gefunden wurde, geht es weiter. Das Programm läuft so auch ganz gut, jedoch sucht er nur in einem fest definierten Verzeichnis (C:\\Windows z.B.). Wenn die Hauptpartition jedoch z.B. den Buchstaben 😨 hat, kann das Programm die Datei natürlich nicht finden.
    Meine Frage ist nun, ob es eventuell eine Variable für den Windows System- und Programmordner gibt, so dass ich also z.B. nach WINDOWS_SYSTEM_FOLDER\\file.dll suchen kann.

    Vielen Dank schonmal im Voraus,
    Kurito





  • Ah, vielen Dank!
    Ich habe mich bisher noch garnicht mit der WinAPI befasst, weshalb ich natürlich nicht daran gedacht habe, in dieser Richtung zu suchen.

    Danke nochmals,
    Kurito



  • Ich bin langsam echt am verzweifeln, ich glaube, ich habe mir da doch etwas zuviel vorgenommen...
    Könnte mir bitte jemand sagen, wie ich zwei ganz normale char-Arrays zusammenfügen kann? Ich habe schon alle möglichen Operatoren ausprobiert, aber der Compiler sagt mir immer wieder "invalid operands of types..." usw.

    MfG
    Kurito



  • Warum arbeitest du nicht einfach mit strings?



  • Ansonsten strcat und Konsorten.



  • Hi,

    ich wollte mich nochmal bei Euch bedanken, Eure Tipps haben mir wirklich sehr weitergeholfen 👍

    Hier ist mal der komplette Quellcode meines kleinen Programms, vielleicht kann jemand damit etwas anfangen. Das ganze ist dafür zuständig, ein Image in das Programm "Daemon Tools" zu laden. Es ist z.B. dann nützlich, wenn man ein Spiel, was auf mehreren CDs ausgeliefert wird, auf eine DVD kopieren will. In meinem Fall war das World of Warcraft, da es mich nervt, bei der Installation ständig die CDs wechseln zu müssen.

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    bool LoadImageFile(char* lzDiscNumber, bool bLoad);
    int iDiscs, iChosenDisc;
    char lzDiscs[3], lzChosenDisc[3];
    
    int main(int argc, char *argv[])
    {
    
        FILE* daemondll = fopen("C:\\Windows\\daemon.dll", "r");
        if(daemondll)
        {
            cout<<"Daemon.dll wurde gefunden.\n"<<endl;
            iDiscs = GetPrivateProfileInt("general", "discs", 0, "./d_launcher.ini");
            cout<<"Anzahl der Discs: "<<iDiscs<<"\n"<<endl;
    
            if(iDiscs > 1)
            {
                for(int i=1; i<=iDiscs; i++)
                {
                    sprintf(lzDiscs, "%d", i);
                    cout<<"("<<lzDiscs<<") ";
                    LoadImageFile(lzDiscs, false);
                }
    
                iChosenDisc = 3;
                while(iChosenDisc != 0)
                {
                    cout<<"\nBitte waehlen Sie die Disc, die Sie laden moechten (0 zum Beenden):"<<endl;
                    cin>>iChosenDisc;
                    if(iChosenDisc > iDiscs)
                    {
                        cout<<"Falsche Eingabe, bitte wiederholen"<<endl;
                        cin>>iChosenDisc;
                    }
                    else if(iChosenDisc == 0)
                    {
                        return 0;
                    }
                    else
                    {
                        sprintf(lzChosenDisc, "%d", iChosenDisc);
                        LoadImageFile(lzChosenDisc, true);
                    }
                }
                return 0;
            }
            else
            {
                LoadImageFile("1", false);
                return 0;
            }
        }
    
        else
        {
            cout<<"Daemon.dll wurde NICHT gefunden!!!"<<endl;
            cout<<"Bitte installieren Sie die Daemon-Tools und starten Sie dieses Programm erneut."<<endl;
        }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    bool LoadImageFile(char* lzDiscNumber, bool bLoad)
    {
        char lzImageFileName[127], lzImageName[127], lzSafeDisc[4], lzSecuRom[4];
    
        GetPrivateProfileString(lzDiscNumber, "isoname", NULL, lzImageName, 127, "./d_launcher.ini");
        GetPrivateProfileString(lzDiscNumber, "isofile", NULL, lzImageFileName, 127, "./d_launcher.ini");
        GetPrivateProfileString(lzDiscNumber, "safedisc", NULL, lzSafeDisc, 4, "./d_launcher.ini");
        GetPrivateProfileString(lzDiscNumber, "securom", NULL, lzSecuRom, 4, "./d_launcher.ini");
    
        char lzLoadParameters[127]; 
        sprintf(lzLoadParameters, "-mount 0, %s -safedisc %s -securom %s", lzImageFileName, lzSafeDisc, lzSecuRom);
    
        //cout<<"ISO-Name: "<<lzImageFileName<<endl;
        //cout<<"Safedisc: "<<lzSafeDisc<<endl;
        //cout<<"SecuROM: "<<lzSecuRom<<endl;
        //cout<<"Befehl: "<<lzLoadParameters<<endl;
    
        if(bLoad == true)
        {
            cout<<"Lade "<<lzImageName<<endl;
            ShellExecute(NULL, "open", "C:\\Programme\\D-Tools\\daemon.exe", lzLoadParameters, NULL, SW_SHOWDEFAULT);
        }
        else
        {
            cout<<lzImageName<<endl;
        }
    }
    

    Es wird noch eine normale INI-Datei benötigt, die wie folgt aussehen muss:

    [general]
    discs=4
    
    [1]
    safedisc=off
    securom=off
    isofile="wow1.iso"
    isoname="World of Warcraft Disc 1"
    
    [2]
    safedisc=off
    securom=off
    isofile="wow2.iso"
    isoname="World of Warcraft Disc 2"
    
    [3]
    safedisc=off
    securom=off
    isofile="wow3.iso"
    isoname="World of Warcraft Disc 3"
    
    [4]
    safedisc=off
    securom=off
    isofile="wow4.iso"
    isoname="World of Warcraft Disc 4"
    

    Leider habe ich die Windows-Variable noch nicht eingebaut. Sobald das gemacht ist, aktuallisiere ich den Code hier natürlich.

    MfG
    Kurito



  • Wenn du C++ und nicht C programmierst solltest du:
    1.) statt "plain"-Dateioperationen fstreams verwenden.
    2.) statt sprintf stringstreams verwenden.
    3.) statt char* string verwenden.

    Generell solltest du wann immer möglich auf globale Variablen verzichten.
    Durch entsprechende Strukturierung ist in deinem Fall ein vollständiger
    Verzicht durchaus machbar.



  • Hi,

    danke für die Tipps. Ich werde mich jetzt erstmal mit den FStreams vertraut machen. Was Strings angeht habe ich bisher nur schlechte Erfahrungen gemacht, aber ich werde mich mal weiter damit beschäftigen.
    Ich bin erstmal nur froh, dass das Programm überhaupt läuft. War eine ganze Menge Arbeit für mich, da ich erst am Dienstag mit C/C++ angefangen habe 🙂
    Ich werde jetzt erst einmal Deine Tipps beherzigen und den Code dementsprechend umschreiben. An seinen Aufgaben wächst man ja bekanntlich 🙂

    MfG
    Kurito


Anmelden zum Antworten