Laden...

Process.Start und Pfad Problem

Erstellt von punkdevil vor 17 Jahren Letzter Beitrag vor 17 Jahren 23.203 Views
P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren
Process.Start und Pfad Problem

Hallo,

ich hab eine exe, die von einer anderen Anwendung aus aufgerufen werden soll.
Die exe verarbeitet eine Datei, welche als Kommandozeilenargument übergeben wird.

Öffne ich von meiner Anwendung aus (mit openFileDialog) die zu übergebende Datei und lasse dann die exe starten (über einen Button) so funktioniert alles wunderbar.

Wenn ich dagegen die zu übergebende Datei mit einem Doppelklick im Explorer öffne (meine Anwednung wird gestartet), so klappt das starten der exe nicht, sondern es wird eine InvalidOperationException ausgeworfen "Verzeichnisname ist ungültig".

Ich vermute, dass es etwas mit der Eigenschaft UseShellExecute zu tun hat, aber ich finde keine Löscung des Problems.

Hier mal mein Code:
Process myProcess = new Process();

                myProcess.StartInfo.FileName = strPathExe;  
                myProcess.StartInfo.Arguments = "-i "+strFileName;  
                myProcess.StartInfo.WorkingDirectory = strFileName.Substring(0, strFileName.LastIndexOf('\\'));  
                myProcess.StartInfo.UseShellExecute = false;  
                myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;  
                myProcess.StartInfo.CreateNoWindow = true;  
                myProcess.Start();  
                myProcess.WaitForExit();  
                myProcess.Close();  

Hat jemand eine Idee woran das liegen könnte?

Gelöschter Account
vor 17 Jahren

ich habe nicht ganz verstanden was du machen möchtest.

wenn du auf eine datei klickst mit der endung .xyz soll da ein programm gestartet werden?
oder
du klickst auf eine exe(von dir) und die ruft ein programm auf mit parametern, welche auf eine datei zugreifen?

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Ich hab eine Anwendung (ne Art Editor) mit dieser erstelle ich eine Datei (txt). Diese Datei soll dann an eine andere exe-Datei übergeben werden (eine Art Parser bzw. Compiler). Von meiner Anwendung aus starte ich diese externe exe und übergebe die erstellte txt-Datei.

Dazu verwende ich die Klasse Process und fülle die ProcessstartInfo.

Wie gesagt, öffne ich die txt-Datei in meiner Anwendung über einen openFileDialog klappt alles super.
Öffne ich die txt-Datei mit meiner Anwendung aber über einen Doppelklick im Explorer (Datei-Verknüfpung ist eingerichtet), so wird meine Anwendung gestartet und die txt-Datei auch geöffnet. Nur der Aufruf der exe-Datei funktioniert nicht mehr...

2.082 Beiträge seit 2005
vor 17 Jahren

Hallo punkdevil,

ganz einfach, ich nehme mal an, du führst die Datei mit einer Pfadangabe wie .\datei.exe aus? Das funktioniert aber nur mit dem OpenFileDialog, da beim Dialog das CurrentDirectory auf den gewählten Pfad gesetzt wird.

Debugge mal und schaue nach, ob der Pfad letztendlich passt, bevor du .Start ausführst.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

myProcess.StartInfo.WorkingDirectory liefert: c:\temp
Directory.GetCurrentDirecrtory liefert: c:\temp

und das bei beiden Varianten.

Gibt es vielleicht noch ein weiteres Directory, welches vor dem Starten der exe gesetzt werden muss?

O
77 Beiträge seit 2006
vor 17 Jahren

Probiers mal mit

            
ProcessStartInfo info = new ProcessStartInfo();
System.Environment.CurrentDirectory = <pfad der datei>
info.FileName = <dateiname>
info.Arguments = <übergabeparameter>
Process p = Process.Start(info);

Obstehende Probleme können häufig miserabel Formuliert und dadurch extrem unverständlich sein

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo odysy,

dein Vorschlag hat leider das selbe Ergebnis.

O
77 Beiträge seit 2006
vor 17 Jahren

komisch bei mir funktioniert das ohne probleme

Obstehende Probleme können häufig miserabel Formuliert und dadurch extrem unverständlich sein

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Das ist wirklich komisch ...

Die exe lag auf nem Netzlaufwerk, ich habs jetzt nochmal lokal versucht, aber das Problem bleibt bestehen.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo punkdevil,

das ist nicht komisch sondern einfach nur eine Konsequenz der Sicherheitseinstellungen.

herbivore

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo herbivore,

kannst du das mit den Sicherheitseinstellungen noch etwas genauer beschreiben?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo punkdevil,

wurde schon öfter mal besprochen, z.B. in .Net 1.1 auf 2.0 . Stichworte wären: SecurityException, Codesicherheit, Codeberechtigung u.ä.

herbivore

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo harbivore,

ich hab mir das mal angeschaut, auch in der MSDN zu SecurityException, aber ich sehe noch keine Lösung für das Problem.

Ich weiß auch gar nicht ob das die Ursache des Problems ist, denn es wird ja folgende Exception ausgeworfen:

System.ComponentModel.Win32Exception: Der Verzeichnisname ist ungültig
bei System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) ...

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo punkdevil,

ok, dann wird wohl eher der Verzeichnisname ungültig sein.

herbivore

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo herbivore,

der Verzeichnisname sollte eben nicht ungültig sein.

Wie oben beschreiben geht es ja, wenn ich in meiner Anwednung die txt-Datei über den openFileDialog öffne. Es geht nur nicht, wenn ich meine Anwendung durch Doppelklick auf eine Verknüpfte Datei (txt) starte.

Die Daten in ProcessStartInfo sind aber identisch.

Das ist ja das kuriose ...

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo punkdevil,

ich sehe allerdings keinen Grund, an der Exception zu zweifeln. Ich vermute, dass es eben doch einen (kleinen, aber entscheidenden und vielleicht auch unsichbaren) Unterschied gibt.

herbivore

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo harbivore,

ich hab aber keien Idee, wo der Unterschied liegen soll.

Folgende Eigenschaften sind bei beiden Varianten gleich:

System.Environment.CurrentDirectory
myProcess.StartInfo.FileName
myProcess.StartInfo.Arguments
myProcess.StartInfo.WorkingDirectory
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = true;

B
1.529 Beiträge seit 2006
vor 17 Jahren

@punkdevil: Was hältst du eigentlich vom Debuggen?

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo Borg,

hab ich ja schon gemacht. Nur wenn ich die Datei mit einem Doppelklick starte, kann ich ja schlecht debuggen. Ich hab mir dann einfach in ner MessageBox die entsprechenden Werte ausgeben lassen.

Ich hab auch schon im VisualStudio beim Debuggen mir eine Datei als Kommandozeilenargument übergeben lassen, dabei tritt der selbe Fehler auf.

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hat denn keiner eine Idee oder einen Hinweis, was ich noch Ausprobieren könnte?

Eventuell liegt es ja wirklich an fehlenden Berechtigungen...

D
128 Beiträge seit 2005
vor 17 Jahren

Hi!

Ich hatte da gerade eine etwas eigenartige Idee. Da Du ja nicht debuggen kannst, weil Du erst einen Doppelklick auf eine mit Deinem Programm assoziierte Datei ausfuehren musst, um Dein Programm zu starten, mach das doch so:

Setze in Deiner Main-Funktion ein Thread.Sleep(20000) an einer Stelle, wo noch nicht viel passiert ist. Nun hast Du ja 20 Sekunden Zeit. Nun wuerde ich mit bspw. dem Visual Studio hingehen, das beretis Dein Projekt geladen hat und dann ueber Debug->Attach to Process Dich an Deinen Prozess haengen. Somit kannst Du schoen durchdebuggen. Ich habe es selber auf diese Art noch nicht probiert, waere aber eventuell ein Ansatz.

Gruss, DaMoe

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Ich kann schon debuggen. In den Einstellungen des Projektes kann ich ja Kommandozeilenargumente übergeben. Dann ist es, wie wenn ich einen Doppelklick mache, und ich kann trotzdem debuggen.
Der Fehler tritt aber auch da auf.

F
10.010 Beiträge seit 2004
vor 17 Jahren

Wenn Du debuggen kannst, stellt sich dann die Frage, wer wirft jetzt diese Exception?

Ist es Process.Start() oder die aufgerufene Anwendung?

D
128 Beiträge seit 2005
vor 17 Jahren

Achso. Es hoerte sich anders an. Gruss, DaMoe

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo FZelle,

Ich gehe mal davon aus Process.Start() wirft die Exception ...

F
10.010 Beiträge seit 2004
vor 17 Jahren

"Ich gehe mal von aus" ist in der SW-Entwicklung immer falsch.

Entweder der Pfad, den Du angibst bei Process.Start ist richtig, dann ist es
die Aufgerufene Anwendung, oder der Pfad ist falsch, dann ist es das Process selber.

Was steht also in strPathExe?

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo FZelle,

in strPathExe steht bei beiden Varianten der korrekte Pfad drin.

z.B. "c:\temp\name.exe"

D
386 Beiträge seit 2007
vor 17 Jahren

Das klingt sehr unwahrscheinlich..
Kannst du einen Testcase dafuer bauen/pasten/herstellen?

Pound for pound, plutonium is about as toxic as caffeine when eaten.

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo DarKlajid,

ich weiss zwar nicht genau was du meinst mit Textcase (ich nehme mal lauffähiger Quellcode), aber das ist etwas umfangreicher. Das wird sicher ein Stück dauern. Es ist aber wahrscheinlich keine schlechte Idee, die Anwendung für diesen Test wirklich auf das allernotwendigste zu reduzieren. Mal sehn, ob ich heut noch dazu komme.

Vielleicht wird die Exception ja wirklich von der aufgerufenen Anwendung ausgeworfen, aber ich kann sie leider nicht debuggen, da ich den Quellcode nicht habe.
In dem Fall muss ja aber der openFileDialog noch irgendetwas machen, was bei einem Doppelklick auf eine verknüpfte Datei nicht passiert.

D
386 Beiträge seit 2007
vor 17 Jahren

Mahlzeit.

Richtig, mit Testcase meine ich kompilierbaren/lauffaehigen Code der das Problem reproduziert. Bisher kann ich das von dir beschriebene nicht nachstellen und damit auch nicht nach einer Loesung suchen. Wenn du es schaffst eine Testumgebung fuer diesen Fehler zu organisieren, dann koennte man nochmal drueber schauen.

Pound for pound, plutonium is about as toxic as caffeine when eaten.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Wie lautet denn der Open-Befehl in der Registry zu deinem Dateityp?
Wichtig ist, dass du das %1 mit Anführungszeichen umschließt ("%1").

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo Borg,

%1 war ohne Anführungszeichen. Ich habs jetzt mit Anführungszeichen drinne, aber der Fehler bleibt bestehen.

D
386 Beiträge seit 2007
vor 17 Jahren

Ich denke das ist hier egal..
Zum einen sagt er (glaube ich?), dass das Problem auch auftritt, wenn er in den VS Debugeinstellungen einen Pfad als Parameter angibt. Also ist es ein Problem mit dem Kommandozeilenparameter selbst, nicht der Registrierung.
Zudem hat er als Beispiel fuer den Inhalt "C:\Temp\Name.exe" angegeben. Wenn wenigstens das Verzeichnis stimmt und er bei Name.exe nicht gerade ein Leerzeichen unterschlaegt, dann sollte das also auch passen.

Aber man kann ja nie wissen..

Pound for pound, plutonium is about as toxic as caffeine when eaten.

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo DarKlajid,

das Verzeichnis und der Name der exe stimmt. Was für ein Leerzeichen meinst du?

Das kuriose, um es nochmal zu wiederholen ist ja, dass die ProssesInfo genau gleich aussieht. Datei mit openFileDialog geöffnet geht, per Kommandozeileparameter gehts nicht.

D
386 Beiträge seit 2007
vor 17 Jahren

Ich hab mich auf die Antwort von Borg bezogen, der dir die "" empfohlen hat. Das ist nur dann relevant, wenn Leerzeichen in deinem Argument sind. Sind sie vermutlich aber nicht?

Nutzt du den gleichen Code (was weiss ich.. Eine Methode SpawnProcess(string exefile)) oder hast du den an zwei Stellen stehen/kopiert? Sicher, dass der gleich ist?
Wie weit ist dein Testcase? 😉

Pound for pound, plutonium is about as toxic as caffeine when eaten.

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Hallo DarKlajid,

also Leerzeichen sind nicht drinne und der Code ist jedesmal der gleiche.

Ich hab es jetzt einfach mal mit der Notepad.exe von Windows probiert, da gehen beide Varianten.

3.825 Beiträge seit 2006
vor 17 Jahren

Hallo Punkdevil,

da kann man sich nur schrittweise rantasten :

Bist Du sicher dass die Exception aus deinem Programm kommt und nicht aus dem das Du aufrufst ?

Rufe doch Process.Start dreimal nacheinander auf, einmal mit der datei aus der Kommandozeile, einmal mit einem fixen Wert und einmal aus File-Dialog.

Schreibe Programm und Verzeichnis die du aufrufst untereinander in eine Textdatei, dann siehst Du sofort die Unterschiede.

Manche Fehler sieht man auf den ersten Blick nicht (Leerzeichen, Slash statt Backslah usw.).

Wenn der Aufruf allerdings mit notepad.exe funktioniert und mit einem anderen Programm nicht dann könnte der Fehler auch im aufgerufenen Programm liegen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Ich hab jetzt herausgefunden, dass , wenn ich

myProcess.StartInfo.UseShellExecute = false;

setze, der Fehler auftritt, wenn es auf true steht, dann geht es.

Allerdings muss ich UseShellExecute auf false setzen, damit ich die Standardausgabe des Prozesses umleiten kann.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Probier mal die Umleitung über die Kommandozeile.

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 17 Jahren

Das Problem hat sich endlich erledigt. Nach langem Suchem habe ich doch in der WorkingDirectory ein Leerzeichen am Anfang übersehen, wenn mein Programm über einen Doppelklick gestartet wurde.

Vielen Dank für die Postings.