Hallo!
Ich erzeuge mit einem c# Programm bestimmte Dateien.
Jetzt will ich, indem man auf die Datei klickt das sich das Programm startet, das krieg ich natürlich hin, nur wie nehme ich die Datei an? Bzw welche Parameter kriegt man dann?
Hoffe hier kann mir jemand helfen, ist nämlich wichtig!
Vielen Dank!!
casbar
Wenn du der Dateierweiterung beispielsweise über die Registry einen Handler alá "MeinProgramm.exe %1" zuweist, dann wird der Dateiname samt Pfad dieser Datei als Parameter übergeben. Auslesen kannst du die Datei, indem du einfach den ein File.Open mit dem Parameter durchführst. Sollte das Programm nicht von selbst die Parameter einlesen, musst du die Main Methode überschreiben:
static void Main(string[] args)
{
FileStream stream = File.Open(args[0]);
}
Hallo casbar und Herzlich Wilkommen,
ja genau mit dem %1 in der registry bekommst du den Pfad mit samt dem namen der datei als parameter übergeben
der Pfad in der Registry wäre
HKEY_CLASSES_ROOT.[Extension]\Shell\Open\Command
als value dann natürlich den Pfad deiner Anwendung mitsamt %1 mit einem Leerzeichen
mfg
hallo,
ich würde auch gerne auf eine datei doppelklicken und dann das programm starten, nur bekomme ich immer nur C:\Users\Username zurück und sonst nichts?? wo mache ich den fehler?? habe %1 in meiner reg stehen
hier die übergabe von der datei:
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new frmMain());
if (args.Length > 0)
{
Application.Run(new frmMain(args[0]));
}
else
{
Application.Run(new frmMain());
}
}
public frmMain(string args)
{
InitializeComponent();
InitializeSettings();
LoadMenu();
this.args = args;
MessageBox.Show(args.ToString());
}
danke,
torti
Hallo Torti,
könntest Du auch mal einen auszug aus deiner Registry Posten
Viele grüße
Lars
könntest Du auch mal einen auszug aus deiner Registry Posten
sicher!
RegistryKey schluessel = Registry.ClassesRoot.CreateSubKey(".cdb");
schluessel.SetValue("", "cdb_auto_file");
schluessel = Registry.ClassesRoot.CreateSubKey("cdb_auto_file");
using (RegistryKey shellEintrag = schluessel.CreateSubKey("shell"))
{
using (RegistryKey open = shellEintrag.CreateSubKey("open"))
{
open.CreateSubKey("command");
using (RegistryKey commandOpen = open.CreateSubKey("command"))
{
commandOpen.SetValue("", @"E:\.....\Debug\....exe %1", RegistryValueKind.ExpandString);
}
}
using (RegistryKey print = shellEintrag.CreateSubKey("edit"))
{
print.CreateSubKey("command");
using (RegistryKey commandOpen = print.CreateSubKey("command"))
{
commandOpen.SetValue("", @"E:\.....\Debug\....exe %1", RegistryValueKind.ExpandString);
}
}
}
//Einfügen eines Icons
using (RegistryKey iconEintrag = schluessel.CreateSubKey("DefaultIcon"))
{
iconEintrag.SetValue("", @"E:\.....\Debug\....exe ,0");
}
mache ich hier was falsch?? mit %1 müsste doch der dateiname übergeben werden. oder??? pfade für das programm, welche zur exe führen stimmen, da das programm erfolgreich gestartet wird.
danke,
torti
Falsch:
Application.Run(new frmMain(args[0]));
Richtig:
Application.Run(new frmMain(args[1]));
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Gemäss MSDN:
Das erste Element des Arrays enthält den Dateinamen des ausgeführten Programms. Wenn der Dateiname nicht verfügbar ist, ist das erste Element gleich String..::.Empty. Die restlichen Elemente enthalten die zusätzlich in der Befehlszeile eingegebenen Token.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Siehe auch [FAQ] mehrere Programminstanzen verhindern (inkl. Parameterübergabe)