IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Plusieurs instances de mon programme, tel est le problème


Sujet :

Windows

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut Plusieurs instances de mon programme, tel est le problème
    Salut les Windows,

    je voudrai d'abord dire que je suis un Linux geek et que je ne comprends pas grand chose a la programmation Windows.

    Mon problème est que quand je sélectionne plusieurs fichiers mp3 et que je les lances avec mon application

    et bien il y autant d'instance de mon programme que de mp3 sélectionné qui se lance sur Windows.

    --

    J'ai bien essayer de programmer mon programme afin qu'il ne soit qu'une unique instance mais dans ce cas

    j'ai autant de message d'erreur de Windows que de fichiers sélectionné - 1.

    ---

    En faisant des essaies j'ai mis mon application comme application par défaut pour les fichiers mp3 mais le comportement est le même.

    MAIS en nettoyant mon système Windows j'ai remarquer cette entrée dans le registre après mon essaie:

    Application pour l'ouverture inexistante "C:\Program Files (x86)\Micro Music Player\mmp.exe" "%1" HKCR\Applications\mmp.exe\shell\open
    Je suppose donc qu'il faut que je trouve le moyen de changer le "%1" en quelque chose comme "%F" pour autant que de fichiers sélectionner a la place de 1 seule,

    ce que cela semble représenter ?

    Et que j'arrive a l'introduire d'une façon ou d'une autre dans le registre, peut-être avec inno-setup ?

    Ou toute autre solution est la bienvenue.

    Merci pour vos réponses éclairé,

    Luke spywoker, le winaze.

    PS: Sinon j'aimerai aussi pouvoir m'introduire dans le menu contextuel de Windows afin que celui-ci dispose d'une option "ouvrir avec mon app", des fichiers ou un dossier cela m'est égale.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le mieux pour ce genre d'association de fichiers, c'est de faire de ton programme une "Drop Target" (un serveur COM) qui soit enregistrée comme Serveur COM Local out-of-process; et plus j'écris ça plus je me dis que je l'ai déjà dit.

    Voici l'article de Raymond Chen à se sujet:
    http://blogs.msdn.com/b/oldnewthing/archive/2010/05/03/10006065.aspx
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ensuite, pour ajouter ta Drop Target au menu contextuel, tu es censé ajouter un Verbe personnalisé au type de fichier. Exemple d'enregistrement d'une Drop Target pour le verbe standard open (même si dans ton cas, je suppose que tu utiliserais plutôt play):
    Code Registre : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HKEY_CLASSES_ROOT
       .mp3
          shell
             open
                DropTarget
                   Clsid = {clsid de ton composant COM}
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Bonjours Médinoc,

    Le mieux pour ce genre d'association de fichiers, c'est de faire de ton programme une "Drop Target" (un serveur COM) qui soit enregistrée comme Serveur COM Local out-of-process; et plus j'écris ça plus je me dis que je l'ai déjà dit.

    Voici l'article de Raymond Chen à se sujet:
    http://blogs.msdn.com/b/oldnewthing/.../10006065.aspx
    Effectivement il est fort probable que tu me l'ai déjà dit car je pose LES questionS concernant un programme dont je suis en train d'écrire une nouvelle version:
    je retente donc le coup concernant une meilleurs intégration Windows.
    Concernant le lien que tu m'a mis je n'y comprends rien, comme la dernière fois:

    les type sont des types Windows, il n'y a que void que je comprend et BOOL dont je devine le type.

    Je ne sais même pas a laquelle de mes 2 questions tu veut répondre ?

    Est-ce concernant le menu contextuelle ou le problème de lancement de fichiers ou les deux a la fois ?

    Je ne peut pas copier le code forunis dans le lien car:

    d'une:

    Le programme et la fonction d'ouverture de fichiers sont déjà écrit

    l'on peut même lancer mon programme avec cmd.exe, sous Windows, en passant plusieurs fichiers en argument: cela fonctionne très bien.

    Mais un de ces Windowscien a voulu que l'on ne lance pas un programme par la ligne de commande de la même manière que de par le serveur graphique de l'environnement de bureau.

    ---

    Est-ce que tu connais un bouquin ou un lien vers un tutoriel pour débuter avec Windows, encore que,

    si celle-ci se veut SI spécifique a son système, que ça,

    que la winapi de m€¬d€ aille se faire voir a la limite.

    ---

    J'utilise Gtk+-3.* comme GUI avec les bibliothèques pratiques qui vont avec

    et la compatibilité avec Windows laisse a désiré, car GTK est plutôt orienter Linux/UNIX.

    Par exemple l'on ne peut, si l'on connais le registre et comme il fonctionne, y accéder mais seulement en lecture.





    ---

    Il me reste la solution que quelqu'un ai la bonté de me donner un bout de code a mettre dans inno-setup afin d'accéder au registre en écriture.

    Pour arriver a mon but, car je vais pas lire des pavée de livres sur Windows si cela me servira pratiquement jamais.

    ---

    Merci de ta compréhension de mes problèmes envers la programmation Windows,

    sache que je n'ai rien contre toi au contraire: tu a essayer de m'aider.

    ---

    Je reformule donc une de mes 2 question: la plus importante.

    Comment fait-on sous Windows pour que ce satanée système comprenne

    que je désire ouvrir plusieurs fichiers d'un coup

    quand ont les sélectionnent avec une seule instance de mon programme.


    Sous Linux cela se fait simplement grâce aux fichiers *.desktop et de leur courte et simple spécification.

    un caractère formateur après l'exécutable dans le fichier *.desktop en majuscule signifie plusieurs fichiers:

    + %F (Pour des fichiers ou répertoires).

    + %U (Pour des URLs).

    + %D (Déprécier pour les répertoires).

    Et en minuscule pour signifier que que l'on de désire lancer qu'un seule fichier, répertoire ou URL.
    Grâce a cette spécification simple de fichier *.desktop n'importe quelle environnement de bureau Linux (Et il y en a beaucoup de différents: Gnome, KDE, Cinnanon, Xfce, LXDE,...) comprendra l'intention.


    Mais Je m'en réfère a mon savoir et donc je vois un caractère formateur analogue a ce que je connais qui est "%1"

    qui semble vouloir dire que l'on ne peut lancer qu'un seule fichier par instance de programme, sous Windows.


    N'y a t il pas une entrée dans le registre qui signifie autant que présent sur la ligne de commande a la place de ce "%1" ?

    Que faut il mettre a la place du "1" afin d'en ouvrir plusieurs ?


    Conclusion:

    Il n'y a pas de salut pour des fascistes parlant leur propre langage afin que personne ne les comprennent,

    surtout pas !

    Cela ferai baisser le prix de (leur connerie propriétaire) et puis merde !
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    Par exemple l'on ne peut, si l'on connais le registre et comme il fonctionne, y accéder mais seulement en lecture.
    HKEY_CURRENT_USER est accessible en lecture/écriture contrairement à HKEY_LOCAL_MACHINE qui demande une élévation de privilèges.

    Citation Envoyé par Luke spywoker Voir le message
    Il me reste la solution que quelqu'un ai la bonté de me donner un bout de code a mettre dans inno-setup afin d'accéder au registre en écriture.
    Même si c'est une mauvaise idée, tu peux jouer sur les permissions, par exemple : Permissions: everyone-full.
    Mais ce qui est modifiable par un utilisateur standard devrait être sous HKEY_CURRENT_USER.


    Pour le reste, voir ici

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Alors, tentons de faire ça dans l'ordre:
    Concernant le lien que tu m'a mis je n'y comprends rien, comme la dernière fois:

    les type sont des types Windows, il n'y a que void que je comprend et BOOL dont je devine le type.

    Je ne sais même pas a laquelle de mes 2 questions tu veut répondre ?
    Est-ce concernant le menu contextuelle ou le problème de lancement de fichiers ou les deux a la fois ?
    Ça répond aux deux à la fois: La DropTarget marche à la fois pour l'ouverture de fichiers multiples et pour le menu contextuel.
    Le programme et la fonction d'ouverture de fichiers sont déjà écrit

    l'on peut même lancer mon programme avec cmd.exe, sous Windows, en passant plusieurs fichiers en argument: cela fonctionne très bien.

    Mais un de ces Windowscien a voulu que l'on ne lance pas un programme par la ligne de commande de la même manière que de par le serveur graphique de l'environnement de bureau.
    • Sous Windows, sauf mention contraire, quand tu sélectionnes deux fichiers du même type et que tu fais "Ouvrir", ça appelle simplement deux fois le programme avec chaque fois l'argument en ligne de commande.
    • Historiquement, pour "fusionner" tout cela, les gens créaient un programme capable de communiquer avec lui-même (avec FindWindow() et SendMessage() par exemple: La seconde instance lancée détectait la première, et lui envoyait le nom du fichier à ouvrir).
    • Mais c'était très lourd (beaucoup de création de processus pour pas grand-chose). Microsoft a alors standardisé cela avec une technique appelée Dynamic Data Exchange (DDE), avec laquelle l'Explorateur pouvait directement détecter si le programme tourne déjà, et lui demander directement d'ouvrir le second fichier, sans créer de nouveau processus.
    • La méthode DropTarget est ce qui a remplacé DDE.

    Avec ça, si tu ne voulais pas en plus le menu contextuel, tu pourrais simplement utiliser l'ancienne technique. Mais tu te heurterais alors à la limite hard ajoutée par Microsoft au nombre de fichiers ouvrables simultanéments de cette manière pour éviter de plomber le PC. Et puisque tu veux le menu contextuel de toute façon...
    Est-ce que tu connais un bouquin ou un lien vers un tutoriel pour débuter avec Windows,
    Hélas, comme introduction à la programmation Windows en général, je ne m'y connais pas trop. Pour apprendre la programmation COM par-dessus ça, j'avais utilisé les COM Tutorial Samples, mais ce sont de vieux projets pour Visual C++ 6...

    D'un autre côté, il devrait être possible de créer une classe gérant la DropTarget, qui appellerait simplement une fonction callback avec les noms de fichiers (et un pointeur de contexte) en paramètre, si GTK ne gère pas sa boucle de messages de façon totalement non-standard...
    Un truc du genre:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef void (*DROPTARGETCALLBACK)(void* context, const wchar_t * const * filePaths);
    BOOL CreateDropTarget(const char* clsid, DROPTARGETCALLBACK callback, void* context); //À appeler au début du process
    //Note: Le Clsid doit être pris en paramètre si c'est une fonction de bibliothèque, parce qu'il faut en générer un nouveau pour chaque projet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je viens de pondre quelque chose, mais la partie difficile c'est l'écriture dans le Registre depuis le code. Prévois-tu d'utiliser un programme d'installation qui pourrait faire ça à la place du code?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Voici ce que j'ai pour l'instant.
    Ça builde sans problème dans mon vieux Visual Studio 2005, mais mon vieux Code::Blocks 10.05 se plaint que SHSetInstanceExplorer() n'existe pas.
    Le .reg, si rectifié pour pointer au bon endroit, lie le code aux fichiers .txt (du moins, si leur association est le "txtfile" par défaut). Il ne devrait pas être trop dur de comprendre comment faire marcher l'association pour d'autres extensions, ou d'autres CLSID.

    Par contre, je n'ai pas pu tester les interactions avec GTK+, ne l'ayant pas chez moi.
    Fichiers attachés Fichiers attachés
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Plusieurs "main" dans mon programme
    Par Fused dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 24/11/2008, 09h02
  2. Comment empêcher de lancer plusieurs instances d'un programme?
    Par homeostasie dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 28/10/2008, 21h14
  3. Plusieurs Instances d'un Programme sous Win XP
    Par Pitchou`n dans le forum Windows XP
    Réponses: 7
    Dernier message: 12/03/2008, 15h14
  4. Réponses: 1
    Dernier message: 22/11/2007, 17h15
  5. [FAQ] une seule instance de mon programme
    Par kacedda dans le forum C#
    Réponses: 6
    Dernier message: 01/02/2007, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo