OUVRIR DES DOCUMENTS DANS LA MÊME INSTANCE DE L'APPLICATION SANS RELANCEMENT DE
LUDINSKI
Messages postés441Date d'inscriptionmardi 2 décembre 2003StatutMembreDernière intervention22 mai 2012
-
13 avril 2007 à 17:21
godvicien
Messages postés36Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention 6 avril 2014
-
17 mars 2008 à 15:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
godvicien
Messages postés36Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention 6 avril 2014 17 mars 2008 à 15:22
Bon il me reste en effet un ultime bug de première ouverture de fichier.
On dirait que ca viens de l'OS.
Sinon j'ai une petite question : Ca sert à quoi ca :
_ddeListener.SubClass = true/false;
Ca veut dire quoi : "définit ou renvoie l'état du subclassing de la form" ??
godvicien
Messages postés36Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention 6 avril 2014 16 mars 2008 à 16:12
Excellent !
Tout fonctionne sur mon soft, le transfert c'est fait sans problème.
En ce qui concerne la class EXTAssociation je la trouve très lourde, le framework .NET permet de manipuler les clés de registre beaucoup plus facilement.
Alors pour la remplacer il faut créer votre classe et bien suivre ce schéma de la base de registre :
(que vous pouvez stocker dans un fichier .reg, c'est ce que je fais pour outrepasser les droits de vista)
Il suffit de remplacer 'ed2k' par votre extension '.xyz'. En effet on peut créer son propre type de liens comme dans cette exemple :
[FichierTexte.reg]
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ed2k]
@="URL: ed2k Protocol"
"URL Protocol"=""
; cette ligne précédente est indispensable pour créer un protocole style "ed2K://votre_URL"
Et lancer l'écoute des messages DDE avec ce code dans votre FormMain.Load() :
_ddeListener = new DDEListener(this.Handle, "eMule.exe", "P2P");
_ddeListener.OnReceiveCommand += new DDEListener.OnReceiveCommandDelegate(DDEListener_OnReceiveCommand);
_ddeListener.SubClass = true;
Et dans votre FormMain.Closing :
_ddeListener.SubClass = false;
Voila j'espère avoir bien résumer le tout. Un grand merci pour cette source parfaitement documentée.
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 16 mars 2008 à 10:30
salut,
pour vista, je pense effectivement qu'il faut être administrateur (et même run as administrator)...
pour le bug du premier lancement, effectivement, si je me souviens bien, je n'ai pas mis de traitement de ligne de commande...je mettrais à jour prochainement...
ShareVB
godvicien
Messages postés36Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention 6 avril 2014 15 mars 2008 à 22:43
Excellent code. C'est exactement ce qu'il me fallait ;-)
Sur vista la classe EXTAssociation ne fonctionne pas. Surement du aux nouveaux droits d'accès à la base de registre.
Sinon en effet le premier double clic sur un fichier .xyz ouvre le soft, mais comme celui ci ne gére pas les lignes de commande il n'affiche pas de "open 1 params. nom_du_fichier.xyz".
Y aurait-il un bug de trouvage de fichier *.exe "%1" ??
nerix27
Messages postés86Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention21 juin 20072 14 juin 2007 à 17:23
Petit bémol à ton appli quand même : j'ouvre une fois l'appli pour bien enregistrer le type de fichierr xyz. Je lance plusieurs fichiers par ci par là sur le dique, juste une instance donc tout va bien.
Mais dès que je ferme l'appli, et que je lance direct un fichier (l'ouverture de ce fichier est sensé créer l'instance unique), j'ai la même erreur que dans mon message ci-dessus. L'appli s'ouvre bien quand même, et l'ouverture d'autres fichiers par dessus ne pose pas de problème.
Donc technique pas très au point. As-tu quelques éclaircissements là dessus ?
D'avance merci...
nerix27
Messages postés86Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention21 juin 20072 14 juin 2007 à 17:10
Salut !
Merci pour cette source.
Je cherche exactement ça pour un de mes progs.
Mais j'ai beau recopier ton code à la lettre (et en important les classes bien sur), ça ne marche pas dans mon appli, alors que ton appli fonctionne parfaitement.
J'ai essayé de recompiler ton appli pour voir si ça venait de moi, mais non, elle marche toujours.
J'ai essayé mon appli sur 2 postes différents (XP et 2000), ça plante sur les 2.
En fait, lorsque je double-clique sur le fichier, Windows me pond l'erreur suivante : [erreur]Windows ne trouve pas 'nom_du_fichier'. Vérifiez que vous avez entré le nom correctement et essayez à nouveau. Pour rechercher un fichier, cliquez sur le bouton Démarrer, puis sur Rechercher./erreur
L'appli s'ouvre bien à chaque fois, mais à chaque fois, c'est une instance différente.
Est-ce que tu sais de quoi cela pourrait venir ?
Une petite interrogation : à quoi te sert la classe Program où tu exportes le Main ?
D'avance merci...
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 13 avril 2007 à 17:59
salut,
en fait, jusqu'il y a deux mois je traduisais les codes "à la bourrin" et depuis j'ai approfondi ma connaissance des classes .net pour passer des certif...mais depuis, je n'ai plus le temps de reprendre les codes ;)...
ShareVB
LUDINSKI
Messages postés441Date d'inscriptionmardi 2 décembre 2003StatutMembreDernière intervention22 mai 20128 13 avril 2007 à 17:21
Salut ShareVB,
ça m'a l'air super intéressant cette histoire de DDE, il faut que je regarde ça de plus près...
En tous cas, bravo pour cette source
J'ai de quoi lire cette nuit ^^
Juste une chose, pourquoi n'as-tu pas utilisé la classe Registry pour accéder à la base de registre ? Tu avais déjà importé un packet de fonctions de l'API...
17 mars 2008 à 15:22
On dirait que ca viens de l'OS.
Sinon j'ai une petite question : Ca sert à quoi ca :
_ddeListener.SubClass = true/false;
Ca veut dire quoi : "définit ou renvoie l'état du subclassing de la form" ??
16 mars 2008 à 16:12
Tout fonctionne sur mon soft, le transfert c'est fait sans problème.
En ce qui concerne la class EXTAssociation je la trouve très lourde, le framework .NET permet de manipuler les clés de registre beaucoup plus facilement.
Alors pour la remplacer il faut créer votre classe et bien suivre ce schéma de la base de registre :
(que vous pouvez stocker dans un fichier .reg, c'est ce que je fais pour outrepasser les droits de vista)
Il suffit de remplacer 'ed2k' par votre extension '.xyz'. En effet on peut créer son propre type de liens comme dans cette exemple :
[FichierTexte.reg]
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ed2k]
@="URL: ed2k Protocol"
"URL Protocol"=""
; cette ligne précédente est indispensable pour créer un protocole style "ed2K://votre_URL"
[HKEY_CLASSES_ROOT\ed2k\DefaultIcon]
@="C:\\Program Files\\eMule\\eMule.exe,0"
[HKEY_CLASSES_ROOT\ed2k\shell]
@="open"
[HKEY_CLASSES_ROOT\ed2k\shell\open]
[HKEY_CLASSES_ROOT\ed2k\shell\open\command]
@=""C:\\Program Files\\eMule\\eMule.exe" "%1""
[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec]
@="[peeurl("%1")]"
[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec\Application]
@="eMule.exe"
[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec\Topic]
@="P2P"
/FichierTexte.reg
Et lancer l'écoute des messages DDE avec ce code dans votre FormMain.Load() :
_ddeListener = new DDEListener(this.Handle, "eMule.exe", "P2P");
_ddeListener.OnReceiveCommand += new DDEListener.OnReceiveCommandDelegate(DDEListener_OnReceiveCommand);
_ddeListener.SubClass = true;
Et dans votre FormMain.Closing :
_ddeListener.SubClass = false;
Voila j'espère avoir bien résumer le tout. Un grand merci pour cette source parfaitement documentée.
16 mars 2008 à 10:30
pour vista, je pense effectivement qu'il faut être administrateur (et même run as administrator)...
pour le bug du premier lancement, effectivement, si je me souviens bien, je n'ai pas mis de traitement de ligne de commande...je mettrais à jour prochainement...
ShareVB
15 mars 2008 à 22:43
Sur vista la classe EXTAssociation ne fonctionne pas. Surement du aux nouveaux droits d'accès à la base de registre.
Sinon en effet le premier double clic sur un fichier .xyz ouvre le soft, mais comme celui ci ne gére pas les lignes de commande il n'affiche pas de "open 1 params. nom_du_fichier.xyz".
Y aurait-il un bug de trouvage de fichier *.exe "%1" ??
14 juin 2007 à 17:23
Mais dès que je ferme l'appli, et que je lance direct un fichier (l'ouverture de ce fichier est sensé créer l'instance unique), j'ai la même erreur que dans mon message ci-dessus. L'appli s'ouvre bien quand même, et l'ouverture d'autres fichiers par dessus ne pose pas de problème.
Donc technique pas très au point. As-tu quelques éclaircissements là dessus ?
D'avance merci...
14 juin 2007 à 17:10
Merci pour cette source.
Je cherche exactement ça pour un de mes progs.
Mais j'ai beau recopier ton code à la lettre (et en important les classes bien sur), ça ne marche pas dans mon appli, alors que ton appli fonctionne parfaitement.
J'ai essayé de recompiler ton appli pour voir si ça venait de moi, mais non, elle marche toujours.
J'ai essayé mon appli sur 2 postes différents (XP et 2000), ça plante sur les 2.
En fait, lorsque je double-clique sur le fichier, Windows me pond l'erreur suivante : [erreur]Windows ne trouve pas 'nom_du_fichier'. Vérifiez que vous avez entré le nom correctement et essayez à nouveau. Pour rechercher un fichier, cliquez sur le bouton Démarrer, puis sur Rechercher./erreur
L'appli s'ouvre bien à chaque fois, mais à chaque fois, c'est une instance différente.
Est-ce que tu sais de quoi cela pourrait venir ?
Une petite interrogation : à quoi te sert la classe Program où tu exportes le Main ?
D'avance merci...
13 avril 2007 à 17:59
en fait, jusqu'il y a deux mois je traduisais les codes "à la bourrin" et depuis j'ai approfondi ma connaissance des classes .net pour passer des certif...mais depuis, je n'ai plus le temps de reprendre les codes ;)...
ShareVB
13 avril 2007 à 17:21
ça m'a l'air super intéressant cette histoire de DDE, il faut que je regarde ça de plus près...
En tous cas, bravo pour cette source
J'ai de quoi lire cette nuit ^^
Juste une chose, pourquoi n'as-tu pas utilisé la classe Registry pour accéder à la base de registre ? Tu avais déjà importé un packet de fonctions de l'API...