Autor |
Beitrag |
KWR1995
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: So 05.01.14 17:27
Hi,
Ich habe ein Problem, mein Programm stürtzt mit der Meldung :"Eine nicht behandelte Ausnahme des Typs "System.ArgumentException" ist in WindowsFormsApplication15.exe aufgetreten.
Zusätzliche Informationen: Der Wert liegt außerhalb des erwarteten Bereichs." ab.
Ich hoffe jemand von euch kann den Fehler finden. Ich bin noch Anfänger, also bitte "leichte" Antworten.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using IWshRuntimeLibrary;
namespace WindowsFormsApplication15 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string quell = textBox1.Text; string user = textBox2.Text; const string gans = "\""; string Pfad = gans + quell + ":\\LAN-Party-Games\\DATA\\Command & Conquer 3\\CNC3.exe" + gans + " -modConfig " + gans + "C:\\users\\" + user + "\\documents\\Command & Conquer 3 Tiberium Wars\\mods\\TiberiumEssence\\TiberiumEssence_1.51.skudef" + gans; WshShell shell = new WshShell(); IWshShortcut link = (IWshShortcut)shell.CreateShortcut(deskDir + "\\Verknüpfung.lnk"); link.IconLocation = quell + "\\LAN-Party-Games\\DATA\\Command & Conquer 3\\cnc3.ico"; link.TargetPath = Pfad; link.Save(); } } } |
Die Verknüpfung sollte zum Pfad:"quell:\LAN-Party-Games\DATA\Command & Conquer 3\CNC3.exe" -modConfig "C:\users\user\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef" führen.
MfG.:
KWR1995
Moderiert von Christian S.: C#-Tags hinzugefügt
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: So 05.01.14 18:15
Und wo tritt der Fehler auf?
Mal nebenbei:
C#-Quelltext 1: 2:
| const string gans = "\""; string Pfad = gans + quell + ":\\LAN-Party-Games\\DATA\\Command & Conquer 3\\CNC3.exe" + gans + " -modConfig " + gans + "C:\\users\\" + user + "\\documents\\Command & Conquer 3 Tiberium Wars\\mods\\TiberiumEssence\\TiberiumEssence_1.51.skudef" + gans; |
Sieht für mich nach einem Versuch aus, eine exe-Datei mit Parametern aufzurufen.
Was ich aber nicht verstehe, warum du das so umständlich machst.
Zum einen: Lass doch die Variable 'gans' weg, die bringt dir rein gar nichts, außer eine längere Zeile.
Außerdem gibt es für den zweiten Teil, hinter modConfig, eine Methode, die dir Pfade zusammen fassen kann:
Path.Combine
Außerdem gibt es die Methode:
string.Format
Gerade die letzte Methode dürfte deinen Code sehr viel ansehnlicher machen, denn damit kannst du einen String schreiben und anschließend irgendwelche weiteren strings an vorher fest gelegten Stellen einfügen.
Ok, ich glaube, ich hab kapiert, was du vor hast.
Du möchtest einen Shortcut erstellen, der darauf eine Datei mit bestimmten Parametern aufruft.
Muss das denn über Shell geschehen? Windows-Forms bietet eigene Techniken um "ShortCuts" zu erstellen, dann allerdings nur im Rahmen des aktuellen Fensters.
Wenn du das über ein Forms-Event regelst, dann kannst du auch die Process-Klasse nutzen um deine exe zu starten und hast gleich viel unübersichtlichen Code um die Parameter weniger.
Für diesen Beitrag haben gedankt: KWR1995
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 05.01.14 18:37
Du solltest nicht nur sagen welche Exception Auftritt sondern auch wo. Dir fehlen vermutlich ein Paar Quotes in deiner Pfad Variablen. Auch wenn ich denke das sich das mit einem anderen Fehler äußern würde.
Zitat: | Ok, ich glaube, ich hab kapiert, was du vor hast. |
No  Es geht um einen Desktop Shortcut keinen Keyboard Shortcut.
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: So 05.01.14 19:32
Wie kann ich den die Pfade mit Path.Comine zusammen führen?
Und der Fehler entsteht, sobald ich auf den Button klicke.
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: So 05.01.14 20:24
OK, ich habs hier mal versucht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using IWshRuntimeLibrary;
namespace WindowsFormsApplication15 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string quell = textBox1.Text; string user = textBox2.Text; const string gans = "\""; string[] paths = {gans, quell, ":\\LAN-Party-Games\\DATA\\Command & Conquer 3\\CNC3.exe", gans, " -modConfig ", gans, "C:\\users\\", user, "\\documents\\Command & Conquer 3 Tiberium Wars\\mods\\TiberiumEssence\\TiberiumEssence_1.51.skudef", gans}; string fullPath = Path.Combine(paths); WshShell shell = new WshShell(); IWshShortcut link = (IWshShortcut)shell.CreateShortcut(deskDir + "\\Verknüpfung.lnk"); link.IconLocation = quell + "\\LAN-Party-Games\\DATA\\Command & Conquer 3\\cnc3.ico"; link.TargetPath = fullPath; link.Save(); } } } |
Nur sagt mir der Debugger, dass "Der Name 'Path' ist im aktuellen Kontext nicht vorhanden".
Wie behebe ich diesen Fehler?
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: So 05.01.14 20:31
Path.Combine hängt die Pfad-Teile, die du übergibst mit dem korrekten Trennzeichen aneinander. Ich meine, dass es den Pfad auch auf Gültigkeit prüft, aber da kann ich mich auch irren.
Also im Prinzip so:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| string directory = @"c:\User\Desktop"; string file = "bla.exe";
string fullPath = Path.Combine(directory, file);
Console.WriteLine(fullPath ); |
Das Ausgabe wäre bei mir:
Quelltext 1:
| c:\User\Desktop\bla.exe |
Das geht deshalb, weil Path.Combine einmal mit einem params-Parameter überladen wurde.
das heißt, wenn du die Methode auf rufst, kannst du für diesen einen Parameter so viele Objekte angeben, wie du willst, solange sie den geforderten Typ besitzen. In der Methode selber sind sie dann als Array zugänglich.
Und du musst auch das Namespace mit einer passenden using-Directive bekannt machen. Das geht ganz simpel via Rechtsklick auf den unbekannten Namen und dann unter "Auflösen".
Oder du schreibst ganz oben in die Datei zu den ganzen "usings" das hin:
C#-Quelltext
Welches Namespace eine Klasse hat, findest du in der msdn-Doku raus, die ich dir verlinkt habe. Das steht nämlich ganz oben gleich unter der allgemeinen Beschreibung.
PS an KWR1995:
Danke, dass du die c#-Tags gesetzt hast, die erleichtern das Lesen doch sehr.
Schön wäre es aber auch, wenn du nur den relevanten Teil postest. In deinem Fall also der Inhalt der Methode 'button1_Click'
Ralf Jansen hat folgendes geschrieben : | Du solltest nicht nur sagen welche Exception Auftritt sondern auch wo. Dir fehlen vermutlich ein Paar Quotes in deiner Pfad Variablen. Auch wenn ich denke das sich das mit einem anderen Fehler äußern würde.
Zitat: | Ok, ich glaube, ich hab kapiert, was du vor hast. |
No Es geht um einen Desktop Shortcut keinen Keyboard Shortcut. |
Verdammt
Ist aber schön zu wissen, wie das geht ^^
Für diesen Beitrag haben gedankt: KWR1995
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 05.01.14 20:35
Klassen aus dem Framework tauchen nicht einfach so im Code auf. Die stecken alle in irgendwelchen Assemblies und Namespaces. Path steckt in einer Assembly die immer referenziert ist das ist also nicht das Problem. Aber Path steckt im Namespace System.IO also musst du entweder den vollständigen Klassennamen verwenden also System.IO.Path oder den Namespace bei den usings aufnehmen. Also bei den anderen usings "using System.IO;" ergänzen. In Visual Studio kannst du auch mal das Contextmenü auf dem Namen Path öffnen und den Menüpunkt Resolve (keine Ahnung wie das genau in Deutsch heißt vermutlich "auflösen" oder so ähnlich) ausführen. Dann wird entweder der using ergänzt oder der Klassename so das die Klasse auffindbar ist.
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Mo 06.01.14 15:29
Ok, jetzt läuft es erstmal soweit, nur leider noch nicht ganz, er schreibt leider nur "C:\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef" als Pfad Anstatt von "D:\LAN-Party-Games\DATA\Command & Conquer 3\CNC3.exe" -modConfig "C:\users\Werner\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef".
Hier nochmal der Überarbeitete Code:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void button1_Click(object sender, EventArgs e) { string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string quell = textBox1.Text; string user = textBox2.Text;
string path1 = @":\LAN-Party-Games\DATA\Command & Conquer 3\cnc3.exe -modconfig C:\users\"; string path2 = @"\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef"; string fullPath = Path.Combine(quell, path1, user, path2); WshShell shell = new WshShell(); IWshShortcut link = (IWshShortcut)shell.CreateShortcut(deskDir + "\\Verknüpfung.lnk"); link.IconLocation = quell + "\\LAN-Party-Games\\DATA\\Command & Conquer 3\\cnc3.ico"; link.TargetPath = fullPath; link.Save(); } |
MfG.:
KWR1995
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 06.01.14 15:40
Das ist ja auch irgendwie kein Path (insbesondere path1 ist kein path) sondern ein Executable Aufruf mit Parameter. Wobei bei beiden (Executable und Parameter) zusätzlich ein Path dabei ist.
Da wäre wohl ein string.Format sinnvoller
C#-Quelltext 1:
| string targetPath = string.Format(@"""{0}:\LAN-Party-Games\DATA\Command & Conquer 3\cnc3.exe"" -modconfig ""C:\users\{1}\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef""", quell, user); |
Wobei ich nicht glaube das das rechtemäßig in Ordnung ist einfach in den Dokumente-Ordner eines anderen Users zu schauen. Wenn sich der Link anlegen läßt würde ich spätestens beim Klick darauf ein "Zugriff verweigert" erwarten. Oder ist user immer der gerade angemeldete User auf dessen Desktop du den Link packen willst?
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Mo 06.01.14 15:46
user ist immer der aktuell angemeldete Benutzer.
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Mo 06.01.14 15:56
Leider funktioniert es nun immer noch nicht
Ich hatte jetzt mal 2 Varianten miz string.Format ausprobiert:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private void button1_Click(object sender, EventArgs e) { string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string quell = textBox1.Text; string user = textBox2.Text;
string path1 = @":\LAN-Party-Games\DATA\Command & Conquer 3\cnc3.exe -modconfig C:\users\"; string path2 = @"\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef";
WshShell shell = new WshShell(); IWshShortcut link = (IWshShortcut)shell.CreateShortcut(deskDir + "\\Verknüpfung.lnk"); link.IconLocation = quell + "\\LAN-Party-Games\\DATA\\Command & Conquer 3\\cnc3.ico"; string TargetPath = string.Format(@"""{0}:\LAN-Party-Games\DATA\Command & Conquer 3\cnc3.exe"" -modconfig ""C:\users\{1}\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef""", quell, user); link.Save(); } |
Bei der aktuellen Möglichkeit ist in der Verknüpfung dein Pfad angegeben,
und bei der Auskommentierten Möglichkeit bricht er nach dem Compilieren, wenn man auf den Button klickt mit dieser Fehlermeldung ab:
"Eine nicht behandelte Ausnahme des Typs "System.ArgumentException" ist in WindowsFormsApplication15.exe aufgetreten.
Zusätzliche Informationen: Der Wert liegt außerhalb des erwarteten Bereichs."
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 06.01.14 16:09
Ich vermute Mal das TargetPath von IWshShortcut nur ein Path will und nicht so wie du einen Commandozeilenaufruf.
Hat IWshShortcut keine Arguments Property wo man die Argumente für die Exe reinschreiben kann?
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Mo 06.01.14 16:13
Wo finde ich den die Arguments Property?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 06.01.14 16:15
Wenn es das gibt an deinem IWshShortcut Object genannt link?
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Mo 06.01.14 16:19
Er wird mir nicht im Projektmappen Explorer angezeigt,
könnte ich die noch wo anders finden?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 06.01.14 16:22
Nein.
Ein Beispiel von jemanden der ähnliches Versuch (erste Antwort). Ich rate mal das er die gleiche Library verwendet wie du.
stackoverflow.com/qu...harp-with-command-li
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Mo 06.01.14 16:25
ok, aber wie müsste in meinem fall das Argument und wie der targetpath aussehen?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 06.01.14 16:27
Das solltest du selbst hinbekommen.
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Mo 06.01.14 18:08
Ich hab mal geraten sollte es so aussehen?:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| private void button1_Click(object sender, EventArgs e) { string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string quell = textBox1.Text; string user = textBox2.Text;
string path1 = @":\LAN-Party-Games\DATA\Command & Conquer 3\cnc3.exe -modconfig C:\users\"; string path2 = @"\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef";
WshShellClass wsh = new WshShellClass(); IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut( Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\shorcut.lnk") as IWshRuntimeLibrary.IWshShortcut; shortcut.Arguments = string.Format(@"{0}:\LAN-Party-Games\DATA\Command & Conquer 3\cnc3.exe", quell); shortcut.TargetPath = string.Format(@"C:\users\{0}\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef", user); shortcut.WindowStyle = 1; shortcut.Description = "my shortcut description"; shortcut.WorkingDirectory = string.Format(@"{0}:\LAN-Party-Games\DATA\Command & Conquer 3", quell);; shortcut.IconLocation = "specify icon location"; shortcut.Save(); } |
Jetzt erhalte ich aber die Fehlermeldung im Debugger:
Fehler 1 Der Interoptyp "IWshRuntimeLibrary.WshShellClass" kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle.
|
|
KWR1995 
      
Beiträge: 18
Win 7
Delphi 4, C# Express
|
Verfasst: Di 07.01.14 16:49
Gut, ich habe nun das Problem gelöst,danke für eure Mithilfe, bei dem letzten Problem musste ich das einbeten von Interupter typen deaktivieren.
Und das hier ist nun der funktionierende Code:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private void button1_Click(object sender, EventArgs e) { string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string quell = textBox1.Text; string user = textBox2.Text; string gans = "\"";
WshShellClass wsh = new WshShellClass(); IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut( Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\shorcut.lnk") as IWshRuntimeLibrary.IWshShortcut; shortcut.Arguments = string.Format(@" -modConfig {1}C:\users\{0}\documents\Command & Conquer 3 Tiberium Wars\mods\TiberiumEssence\TiberiumEssence_1.51.skudef{1}", user, gans); shortcut.TargetPath = string.Format(@"{0}:\LAN-Party-Games\DATA\Command & Conquer 3\cnc3.exe", quell); shortcut.WindowStyle = 1; shortcut.Description = "Command and Conquer 3 TW mit Tiberium Essence 1.51"; shortcut.WorkingDirectory = string.Format(@"{0}:\LAN-Party-Games\DATA\Command & Conquer 3", quell); ; shortcut.IconLocation = "specify icon location"; shortcut.Save();
} |
Und nochmals Danke,
MfG.:
KWR1995
|
|