Exécutable et Paramètres

Fermé
johann74270 - 9 janv. 2015 à 09:26
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 - 21 janv. 2015 à 17:07
Bonjour,
Je suis un programmeur de métier cependant je débute ma carrière dans ce domaine, c'est pourquoi j'ai besoin de votre aide :

Prenons l'exemple du lecteur multimédia de Windows :
Je clique sur une chanson, Media Player se lance et lance ma musique.
Maintenant je clique sur une autre musique, Media Player lance ma musique (Note : Media Player n'est pas exécuté 2 fois).

Ce que je souhaite dans mon application :

- Clique droit sur le fichier que je souhaite envoyer par mail par exemple, Cliquer sur "Envoyer le fichier vers la boite mail de Toto", ensuite mon logiciel est lancé et envoie le fichier.

- (Note : Le logiciel reste ouvert)

- Je souhaite envoyer un autre fichier, même procédure, clique droit, puis envoyer, le logiciel qui est ouvert procède à l'envoie du mail à Toto.


J'ai besoin d'aide sur le fait que quand je souhaite envoyer un autre fichier, le logiciel ne se lance pas une deuxième fois, mais que le fichier est géré par le logiciel qui est déjà ouvert.



Merci de bien vouloir m'aider à aboutir mon projet.
Cordialement.



1 réponse

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
9 janv. 2015 à 16:53
Bonjour
il faut avant tout vérifier si une instance de ce logiciel est pas déjà active en clair, si elle est en pas en cours d'utilisation. Si c'est le cas, on lui passe les différents arguments lui permettant d'effectuer la tâche solicité sans pour autant démarrer une autre instance exemple, d'algorithmes simple
 
liste ou file de commande LIST (de type Fifo)
si pas d'instance start
faire :
LIST <-- argument à executer;
Executer App
Traiter LIST
sinon si LIST:
faire:
LIST <-- argument
Traiter LIST
sinon:
Executer App sans arg

à bientôt
0
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
17 janv. 2015 à 02:37
mais techniquement ça se traduit comment, si une autre instance est déjà présente ?
Avec un PIPE ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
17 janv. 2015 à 18:55
Avec une API Microsoft par exemple : FindWindow()
0
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
18 janv. 2015 à 00:45
Pour trouver une fenêtre, oui, mais pour passer les arguments en question au programme qui est déjà en cours d'exécution ? avec un socket ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
18 janv. 2015 à 01:02
Par exemple :-)
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 18/01/2015 à 07:13
Bonsoir
le PIPE va être utilisée pour envoyer les arguments ou certaines commandes à l'application qui a déjà une instance active.

Ce qui intéresse @johann74270 c'est comment avoir une seule instance effectivement sous Windows ça l'air simple il suffit de faire appel aux routines système pour savoir si un processus ne porte pas déjà le même nom de l'application x mais sur UNIX/ GNU LInux c'est autre chose.
La plupart des développeurs utilise un verrou sur fichier exemple fichier.pid certes, c'est une des méthodes utile mais elle présente des défaut car, on peut contourner le problème avec la commande suit dans le terminal exemple
$ mv CCM_INSTANCE_START CCM_INSTANCE_START_BIS 
(rappel:en utilise un mécanisme de verrou est basé sur un fichier).
il existe également d'autre méthodes comme les D-BUS ou SOCKET UNIX d'autres utilise la mémoire partagée, IPC etc. en clair chacun ça méthode
exemple : /!\attention: c'est un code qui n'est pas optimisé et peut comporter des erreurs dont je m'en excuse d'avance
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE
#endif

#if ! defined(_XOPEN_SOURCE) || _XOPEN_SOURCE < 500
#define _XOPEN_SOURCE 500
#endif

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>

typedef enum{
 false,
 true
}bool;

/* Constance fichier de verrou */
#define _INSTANCE_ "CCM_INSTANCE_START"

/**
* Fonction qui teste en premier l'existence d'un vérrou
* si pas de vérrou alors, l'application crée
* le fichier vérrou et à ce titre devient l'unique instance
**/
bool bf_Create_Secure_Instance( void ){

 int iFlag = 0;
 iFlag = open( _INSTANCE_, O_RDONLY );
 if( iFlag == -1 ){
  iFlag = open(_INSTANCE_, O_RDWR | O_CREAT, S_IRWXU );
  if( iFlag == -1 ){
   return( false );
  }else{
   close( iFlag );
   return( true );
  }
 }else
  return( false );
}

/***
* la fonction est idem à la fonction
* bf_Create_Secure_Instance
**/
bool bf_Create_Secure_Instance_2( void ){

 int iFlag = 0;
 FILE *pFlux = NULL;

 iFlag = open( _INSTANCE_, O_RDONLY );
 if( iFlag == -1 ){
  pFlux = fopen( _INSTANCE_, "w" );
  fclose( pFlux );
  return( true );
 }
 return( false );
}

/***
* Cette fonction procède de la même manière que les autres
* mais en utilisant les PIPE. si le fichier verrous
* existe déjà alors en utile le fichier que l'on ouvre comme
* pipe en injectant les arguments.
* le traitement des informations du flux pourra être exécuté
* par un thread de lecture de flux du programme en instance
**/
bool bf_isInstance( const char *p ){

 int iFlag = 0;
 FILE *pFlux = NULL;
 iFlag = open( _INSTANCE_, O_RDONLY );
 if( iFlag != -1 ){
  pFlux = popen( p, "w+");
  if( pFlux == NULL ){
   return( false );
  }
  if( pclose( pFlux ) == -1 ){
   return( false );
  }
 }
 return ( bf_Create_Secure_Instance_2() );
}

/* Supression du fichier */
void f_uInstance( void ){
 remove( _INSTANCE_ );
}


int main( void ){


 /* Teste instance 1 */
 /*if( !bf_Create_Secure_Instance() ){
  printf("Une instance existe dejà\n");
  exit( EXIT_SUCCESS );
 }*/

 /* Teste instance 2 */
 if( !bf_Create_Secure_Instance_2() ){
  printf("Une instance existe dejà\n");
  exit( EXIT_SUCCESS );
 }

 /*
  * Instance 3 avec injection
  * qui peut être également argv[2]
  */
 /*if( !bf_isInstance("source.c") ){
  printf("Une instance existe dejà\n");
  exit(EXIT_SUCCESS);
 }*/

 getchar();
 f_uInstance();

 return( EXIT_SUCCESS );
}


à bientôt
0