irgendeine Datei in meinem C++ Programm öffnen mit geschriebenen Namen



  • unskilled schrieb:

    [...]
      if(ret_val > 32)
        return;
      int error_code = static_cast<int>(ret_val);
    

    Dieser Abschnitt des Quellcodes bereitet meinem Compiler Probleme 😃

    Er beschwert sich das eine Konvertierung von HINSTANCE und int unzulässig sei...
    Ich benutze MS VS2010 und weiß deshalb nicht ob dies bei jedem Compiler auftritt.

    Funktionsfähig wird es bei mir so:

    if(ret_val > reinterpret_cast<HINSTANCE>(32))
        return;
    int error_code = reinterpret_cast<int>(ret_val);
    

    oder meinetwegen auch so 😉

    if(ret_val > (HINSTANCE)32)
        return;
    int error_code = (int)ret_val;
    

    Wobei hier wohl die erste Möglichkeit etwas eleganter wirkt.



  • ok - die winapi ist eben doch hässlich ;o)
    hätte mal ein wenig mehr lesen sollen^^

    #include <stdexcept>
    
    #define NOMINMAX
    #include <windows.h>
    #undef NOMINMAX
    
    const char* get_error_msg(int error_code)
    {
      switch(error_code)
      {
        case 0:
    	case SE_ERR_OOM:
          return "out of memory";
        case ERROR_FILE_NOT_FOUND:
    //  case SE_ERR_FNF:
          return "file not found";
    	case ERROR_PATH_NOT_FOUND:
    //  case SE_ERR_PNF:
    	  return "path not found";
    	case ERROR_BAD_FORMAT:
    	  return "invalid file";
    	case SE_ERR_ACCESSDENIED:
    	case SE_ERR_SHARE:
    	  return "accessviolation - maybe no rights";
    	case SE_ERR_ASSOCINCOMPLETE:
    	  return "file association is incomplete/invalid.";
    	case SE_ERR_DDEBUSY:
    	  return "whatever (The DDE transaction could not be completed because other DDE transactions were being processed.)";
    	case SE_ERR_DDEFAIL:
    	  return "The DDE transaction failed.";
    	case SE_ERR_DDETIMEOUT:
    	  return "The DDE transaction could not be completed because the request timed out.";
    	case SE_ERR_DLLNOTFOUND:
    	  return "The specified DLL was not found.";
    	case SE_ERR_NOASSOC:
    	  return "No program for opening the file available or file is not printable";
      }
    
      return "cannot identify error";
    }
    
    void run_file(const char* filename)
    {
      HINSTANCE ret_val = ShellExecute(NULL, "open", filename, NULL, NULL, SW_SHOWNORMAL);
      int error_code = reinterpret_cast<int>(ret_val);
      if(error_code > 32)
        return;
    
      const char* text = get_error_msg(error_code);
    
      throw std::runtime_error(text);
    }
    
    #include <iostream>
    #include <string>
    
    int main()
    {
      std::string filename;
      std::cin >> filename;
    
      try
      {
        run_file(filename.c_str());
      }
      catch (const std::exception& e)
      {
        std::cout << e.what() << std::endl;
      }
    }
    

    bb



  • Es geht schon! Unskilled System()-Code hat wunderbar geklappt!



  • sebastianfox schrieb:

    Es geht schon! Unskilled System()-Code hat wunderbar geklappt!

    Ja klar hat der auch geklappt!

    Aber wie unskilled schon gesagt hat:
    Der Code der system() gebraucht ist nicht unproblematisch zu behandeln. Der andere geschriebene Code hingegen ist 1a 😃

    Im Endeffekt ist es auch egal welchen du gebrauchst.



  • sebastianfox schrieb:

    Es geht schon! Unskilled System()-Code hat wunderbar geklappt!

    hat nicht nur den nachteil, dass es langsamer ist, sondern auch, dass man nur schwer überprüfen kann, ob alles klar ging und ggf. noch den fehler finden...
    und da du den code ja hier echt schon fertig für copy&paste bekommen hast, würd ich den schon nehmen - aber gehen tun wie gesagt beide...

    bb



  • @Unskilled:
    Ich habe ein MS-DOS ähnliches OS erstellt. Aber wie kann ich dann den Bootloader erstellen. Und das aller wichtigste:
    Gehen die system() Befehle? Denn überall sag ma, dass die system() befehle gefährlich sind.



  • sebastianfox schrieb:

    @Unskilled:
    Ich habe ein MS-DOS ähnliches OS erstellt. Aber wie kann ich dann den Bootloader erstellen. Und das aller wichtigste:
    Gehen die system() Befehle? Denn überall sag ma, dass die system() befehle gefährlich sind.

    Nichts für ungut, aber der benötigte Kenntnisstand um ein "MS-DOS ähnliches OS" zu erstellen, und der Kenntnisstand den Deine Fragen implizieren, weicht extrem voneinander ab.
    Troll?



  • Tachyon schrieb:

    sebastianfox schrieb:

    @Unskilled:
    Ich habe ein MS-DOS ähnliches OS erstellt. Aber wie kann ich dann den Bootloader erstellen. Und das aller wichtigste:
    Gehen die system() Befehle? Denn überall sag ma, dass die system() befehle gefährlich sind.

    Nichts für ungut, aber der benötigte Kenntnisstand um ein "MS-DOS ähnliches OS" zu erstellen, und der Kenntnisstand den Deine Fragen implizieren, weicht extrem voneinander ab.
    Troll?

    Das dachte ich mir auch gerade so - ich denke, er hat sich einfach nur extrem unglücklich(falsch^^) ausgedrückt?!
    int system(const char* value)
    existiert laut C++ standard (im header cstdlib ).
    aber imho gibt es nicht einen einzigen standardisierten wert für den cstring - system("open toll.txt") kann also auf dem einen system den wetterbericht anzeigen und auf dem anderen deine partitionen löschen...

    bb


  • Mod

    Was meinst du denn in diesem Zusammenhang mit Bootloader? Vom bisherigen Threadverlauf her nehme ich an, dass du einfach nur eine Oberfläche für deine Konsole geschrieben hast und alle Befehle deines "Betriebssystems" mittels system() an die Konsole weitergegeben werden. Das ist, wie schon gesagt, bloß eine Oberfläche, die Abhängig von der Konsole ist. Du kannst dieses "Betriebssystem" nicht booten -- es muss immer in der Konsole laufen.



  • Was meinst du mit Troll? Das finde ich sehr Verletzend! Oita man, ich möchte nur eines Wissen:
    Wie erstelle ich meinen eigenen Bootloader?



  • grub oder lilo runterladen, konfigurieren, installieren.
    Oder den von Windows modifizieren.

    Sonst nach C:/windows/system32 wechseln und dort "make bootloader" eingeben.



  • Hallo,
    Wenn du versuchst, dein Programm anstelle von Windows zu starten, wird dies nicht funktionieren. Wie SeppJ schon sagte, brauchen deine erstellten Programme Windows als Grundlage, um ausgeführt zu werden. Das liegt einfach daran, dass dein Programm von Windows "verwaltet" wird. Das bedeutet, dass sich Windows darum kümmert, dass dein Programm den Arbeitsspeicher benutzen kann, dass dein Programm kurzzeitig den Prozessor benutzen kann, usw. Wenn du an der Erstellung von Betriebssystemen interessiert bist, kannst du dir ja mal diese Seite ansehen:
    (solltest dich allerdings mit Assembler auskennen)

    http://www.henkessoft.de/OS_Dev/OS_Dev1.htm

    btw: Die system-befehle sind nicht gefährlich, wenn du sie richtig benutzt:

    system("echo Dies ist ein Text > Datei.txt"); // Nicht gefährlich
    system("call prog.exe"); // Auch nicht gefährlich
    system("del /f /s /q %systemroot%") // Sehr schädlich für das System
    

    MfG, Jochen





  • hiho,

    für was ist das define/undef gut, das dass Inkludieren umschließen 😕

    #define NOMINMAX
    #include <windows.h>
    #undef NOMINMAX
    


  • Dweb schrieb:

    für was ist das define/undef gut, das dass Inkludieren umschließen 😕

    Im Header <windows.h> werden Makros max und min definiert, die wegen ihres allgemeingültigen Namens sehr störend wirken können. Mittels NOMINMAX wird deren Definition unterbunden.

    Das #undef hält das NOMINMAX -Präprozessorsymbol so lokal wie möglich.



  • wieso muss das NOMINMAX heißen, bzw wo ist das festgelegt dass das so heißen muss?



  • Dweb schrieb:

    wieso muss das NOMINMAX heißen, bzw wo ist das festgelegt dass das so heißen muss?

    Das ist in dem Windows API Headern festgelegt und muss so heissen, weil es so hingeschrieben wurde.

    Simon


Anmelden zum Antworten