Redirection de parametres vers une seul instance

Signaler
Messages postés
18
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
4 janvier 2007
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour,

Voila je debute en C# et sur le forum ... J'aimerai lorsque mon application est lancé, et que je reexecute l'executable avec des parametres, bloqué l'execution du second lancement tout en recuperant les parametres et les passer à ma premiere instance(style ajouté des morceaux à une playlist style winamp,media player ...).
J'ai trouvé comment recupere les argument passé a un programme et comment bloqué a une seul instance un programme, mais je n'ai pas trouvé comment faire une "compilation" des deux. J'espere que j'ai été assez clair.

4 réponses

Messages postés
60
Date d'inscription
mardi 26 juillet 2005
Statut
Membre
Dernière intervention
16 avril 2006

Tu pourais toujours:
1.)Enregistrer les paramètres dans un fichier----
public static void WriteFile(string[] args){
System.IO.StreamWriter Fichier = System.IO.File.CreateText(@"C:\temp_args.arg");
string toWrite = "";
for (int i=0;i<args.Length;i++){
toWrite+= args[i]+"|";
}
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"\|$");
toWrite = reg.Replace(toWrite,"");
MessageBox.Show(toWrite);
Fichier.Write(toWrite);
Fichier.Close();

}
----
2.) Ajouter ceci dans Main(), en remplacant [TaClasse] par la classe qui contient la fonction Main et [TonExecutable] avec le nom de l'executable sans le .exe---
if (System.Diagnostics.Process.GetProcessesByName("[TonExecutable]").Length == 1){
Application.Run(new [TaClasse]());
}
else{
[TaClasse].WriteFile(args);
}
----
3.) Ajouter le Contrôle Timer de Windows, mettre Enabled à "true" et Interval à "1000". créez une fonction pour l'événement "Elapsed" et mettez ceci----
System.IO.StreamReader sr = System.IO.File.OpenText(@"temp_args.arg");
string[] args = sr.ReadToEnd().Split(System.Convert.ToChar("|"));
sr.Close();
----

Ça devrait fonctionner, si j'ai compris ce que tu voulais dire. Dans 3.) tout ce qu'il reste c'est de traiter le tableau args pour en faire ce que tu veux.
Messages postés
60
Date d'inscription
mardi 26 juillet 2005
Statut
Membre
Dernière intervention
16 avril 2006

J'ai oublié de te dire que dans 3.) tu peux ajouter à la fin "System.IO.File.Delete("temp_args.arg")" pour supprimer le fichier temporaire.

J'espère que ça t'a aidé
Messages postés
18
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
4 janvier 2007

Merci pour ta solution. J'y avais pensé mais je pensé qu'il y avait d'autre solution que d'utiliser un fichier. Je vais continuer a chercher et si je ne trouve pas je prendré ta solution. Merci encore
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
90
Salut,

Effectivement ça peut être une solution, mais elle peut aussi potentiellement poser un problème de sécurité.
Déjà pour ce genre de tâche il vaudrait mieux commencer par utiliser un répertoire propre à l'utilisateur pour lesquels les ACL sont restrictives vis à vis des autres utilisateurs du système.
L'autre raison étant que rien ne garantis qu'un autre répertoire soit accessible en écriture pour l'utilisateur de l'appli.
Mais même avec ça, rien n'empêche une autre application d'accèder à ce fichier.
Une solution pourrait être d'utiliser IsolatedStorage pour le fichier temporaire.

Sinon en dehors de cette méthode on peut aussi passer pour des mécanisme comme le Remoting (sur localhost uniquement), souvent utilisé pour cette tâche je pense, mais qui peut poser un problème si ton application est destiné au grand public : certains utilisateurs rendu un peu paranoïaques par leurs firewalls applicatifs vont te bloquer la communication, même sur le localhost.

Sinon il reste aussi les techniques comme les mailslots, named pipes, etc mais le Framework (du moins dans sa version 1.1, et je n'ai pas eu vent d'une prise en charge dans le 2.0) ne fournit pas de wrapper pour les méthodes de l'API WIn32 permettant de les manipuler.

/*
coq
MVP Visual C#
*/