none
Prozesse wie z.b. exe Starten: Sucht im falschen verzeichniss RRS feed

  • Frage

  • Hallo zusammen!!

    Wenn ich eine exe-Datei starten will,  dann sucht das Programm die exe immer im aktuellem Verzeichniss wo die WinForms-exe liegt, dor würde er sie auch finden. Die exe-Datei in einem Unterordner zu starten schlägt fehl. Ich habe mir überlegt, ob es vieleicht nicht am Visual C++ 2008 Express liegt, ob mann dort fieleicht noch etwas umstellen muss.

    Hir ein Codausschnitt. Dies ist das einzige wass mein WinForms-Programm macht.

    private: System::Void toolStripMenu_StartGame_Click(System::Object^  sender, System::EventArgs^  e) {
    
    String^ locn = Application::StartupPath + "\\Game\\Basiskern.exe";
                    ProcessStartInfo^ info = gcnew ProcessStartInfo(locn);
    	info->Arguments = path; 
                    info->RedirectStandardInput = false; 
                    info->RedirectStandardOutput = true; 
                    //info.Password= "swarup"; 
                    // info.FileName ="cmd.exe"; 
                    info->UseShellExecute = false; 
    	info->WindowStyle = ProcessWindowStyle::Normal; 
                    //  info.Arguments = path; 
                    info->CreateNoWindow = true; 
                    info->RedirectStandardError = true; 
    	Process^ process = Process::Start(info);
    }
    Samstag, 12. Dezember 2009 02:11

Antworten

  • Du bringst da was durcheinander....
    Was Du anpassen iwllst ist das "Aktuelle Verzeichnis"... nicht den Pfad der EXE; der ist ja von Dir fest vorgegeben.
    Wenn Du kein Aktuelles Verzwichnis (WorkingDirectory) vorgibst, nimmt er das aktuelle Verzeichnis Deines Parent-Prozesses...

    Wenn Du das WorkingDirector ändern willst, dann musst Du das auch setzen:
    ProcessStartInfo ^info = gcnew ...;
    info->WorkingDirectory = System::IO::Path::GetDirectoryName(info->FileName);

    Jochen Kalmbach (MVP VC++)
    Sonntag, 13. Dezember 2009 20:23

Alle Antworten

  • Was ist denn jetzt genau Dein Problem? Wenn Du den Pfad zu Deiner EXE genau vorgibst, dann muss diese auch dort genau liegen!
    Oder was wolltest Du uns mit Deinem Posting sagen?
    Was schlägt denn fehl? Welche Fehlermeldung?
    Jochen Kalmbach (MVP VC++)
    Samstag, 12. Dezember 2009 20:20
  • Dass ist mir klar, dass die exe genau dort liegen muss wo der Pfad hinzeigt. Dass Problem ist nur dass wenn ich auf ein exe in einem Unterortner ansprechen will mit Pfadangabe, dann sucht er nicht im angegebenen unterverzeichniss sondern im aktuellen Ordner wo die WinForms-exe liegt. Diese exe würde er finden, schade nur dass es das falsche Verzeichniss ist. 
    Sonntag, 13. Dezember 2009 02:59
  • Ich verstehe Dich nicht...
    Gibt doch mal im Debugger den Pfad aus, denn Du zusammengebaut hast!
    Und verwendet bitte "Path::Combine" um Pfade zusammen zu bauen!
    Jochen Kalmbach (MVP VC++)
    Sonntag, 13. Dezember 2009 10:11
  • ich habs jetzt folgendermassen gemacht:

     

    String^ path = Application::StartupPath;
    String^ exe = "\\Game\\Basiskern.exe";
    String^ locn = Path::Combine(path, exe);
    ProcessStartInfo^ info = gcnew ProcessStartInfo(locn);

     



    Wenn ich beim debugen, bei "ProcessStartInfo^ info = gcnew ProcessStartInfo(locn);" ausgeben lasse, bekomme ich folgende Ausgabe: 

      exe "\Game\Basiskern.exe" System::String^
      info <Nicht definierter Wert> System::Diagnostics::ProcessStartInfo^
      locn "\Game\Basiskern.exe" System::String^
      path "c:\C++\Projects\TestWinForms\GameSarten1\Debug" System::String^
    +  this 0x02801750 { menuStrip1=0x02803eb4 startToolStripMenuItem=0x028066c8 gameToolStripMenuItem=0x028068e8 ...} GameSarten1::Form1^



    Habe ich das Path::Combine falsch benutzt?

    Aber so wie ich es zuvor gemacht habe und auch wieder bei "ProcessStartInfo^ info = gcnew ProcessStartInfo(locn);" ausgeben lassen habe, gab er mir dies aus:

      locn "c:\C++\Projects\TestWinForms\GameSarten1\Debug\Game\Basiskern.exe" System::String^


    Ich glaubs an der Pfadangabe liegt es nicht, der Pfad währe richtig gewesen.

    Sonntag, 13. Dezember 2009 19:20
  • Hier nochmals die Ausgabe, bei dem wie ichs zuvor gemacht habe.

    locn "c:\C++\Projects\TestWinForms\GameSarten1\Debug\Game\Basiskern.exe" System::String^

    Sonntag, 13. Dezember 2009 19:25
  • Ich verstehe Dich immer noch nicht... WAS ist denn Deiner Meinung nach falsch?
    Und WAS geht denn nicht?
    Jochen Kalmbach (MVP VC++)
    Sonntag, 13. Dezember 2009 19:43
  • Ich kann mich leider nur wiederholen, aber ich probiers mal anders zu formulieren.

    Also, ich übergieb der "Process^ process = Process::Start(info);" Funktion die "info" Struktur  mit dem Pfad und dem ganzen zeugs.

    Der Pfad ist:
    c:\C++\Projects\TestWinForms\GameSarten1\Debug\Game\Basiskern.exe

    also sollte das Programm am angegebenen Pfad das Basiskern.exe Starten. Stadtdessen geht er in volgenden Pfad die exe suchen:
    c:\C++\Projects\TestWinForms\GameSarten1\Debug\Basiskern.exe

    also sucht er im aktuellen Verzeichniss wo die WinForms.exe liegt. Wenn ich die Basiskern.exe dort reinpacke, kann es sie auch öffnen. Nur sollte er ja die Basiskern.exe im Verzeichniss
    c:\C++\Projects\TestWinForms\GameSarten1\Debug\Game\Basiskern.exe
    starten weil ich diesen Pfad ja angegeben habe. Aber genau dies geht nicht.

    Sonntag, 13. Dezember 2009 20:16
  • Du bringst da was durcheinander....
    Was Du anpassen iwllst ist das "Aktuelle Verzeichnis"... nicht den Pfad der EXE; der ist ja von Dir fest vorgegeben.
    Wenn Du kein Aktuelles Verzwichnis (WorkingDirectory) vorgibst, nimmt er das aktuelle Verzeichnis Deines Parent-Prozesses...

    Wenn Du das WorkingDirector ändern willst, dann musst Du das auch setzen:
    ProcessStartInfo ^info = gcnew ...;
    info->WorkingDirectory = System::IO::Path::GetDirectoryName(info->FileName);

    Jochen Kalmbach (MVP VC++)
    Sonntag, 13. Dezember 2009 20:23
  • cool, jetzt funktionierts. Danke für die Hilfe! Und für deine Geduld :)
    Sonntag, 13. Dezember 2009 20:36