INSTANCE UNIQUE + COMMUNICATION DE MESSAGES (COMPATIBLE 32 ET 64 BIT)
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009
-
10 mars 2008 à 20:26
taupe4
Messages postés91Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention17 avril 2008
-
12 mars 2008 à 01:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
taupe4
Messages postés91Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention17 avril 20081 12 mars 2008 à 01:06
Bah en fait le système de communication doit être paramétré pour être utilisé. Pour les gens qui ne veulent que savoir si ya déjà une instance ouverte, ils n'ont qu'à créer un SingleInstanceManager et, s'ils veulent faire apparaitre leur fenêtre, ils font SetWindow (met le handle dans la zone mappée) et le travail peut se faire. La communication est désactivée tant qu'on ne l'a pas explicitement demandée.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 mars 2008 à 00:47
Pas que pour le developpeur, pour le CPU aussi...
Mais bon, avec .NET on n'est plus à ça près.
taupe4
Messages postés91Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention17 avril 20081 11 mars 2008 à 23:22
Je tiens à spécifier que ta méthode est effectivement celle utilisée par le programme. Le HWND est transféré dans une région partagée en mémoire. Par contre le "dialogue" est pour envoyer des chaînes de caractères vers l'application. Pour cela envoyer des WM_COPYDATA est plus adapté. Mais cela cause une surcharge pour le développeur .NET, qui doit surcharger WndProc.
taupe4
Messages postés91Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention17 avril 20081 11 mars 2008 à 23:15
@BruNews:
Est-ce que ta source permet le transfert de paramètres comme ceux envoyés par l'éxécutable ? on dirait que non. La première partie est rigoureusement identique à la mienne. Et si c'était juste cela, il existe des mécanismes en .NET qui font cela. Des sources sont d'ores et déjà disponibles sur csharpfr. Mais ma source permet de transférer simplement des chaînes de caractères vers l'instance unique en utilisant WM_COPYDATA. Dans Paint.NET, cette fonctionnalité est utilisée pour envoyer vers la fenêtre les images qu'on ouvre via l'explorateur windows.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mars 2008 à 20:24
Surtout pas un pointeur, simplement un nombre de 4 octets qui l'identifie de manière unique dans le système.
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 11 mars 2008 à 20:18
ok merci, un handle de la fenêtre c'est une sorte de pointeur vers celle ci ? ou je dis une connerie ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mars 2008 à 20:15
C'est du C, pas de ++.
HWND c'est le handle de fenêtre, le descripteur unique de chaque fenêtre.
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 11 mars 2008 à 20:08
@Taupe4 : Pour avoir essayé sous vista et serveur 2008, ca marche bien UAC activé.
@BruNews : Moi j'ai une question bête c'est quoi le hwnd ? c'est peu être con mais je ne sais pas ce que c'est. Ta source cpp est transposable en .net ? J'avoue plus trop bien me souvenir du c++, j'en ai pas fait longtemps ;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mars 2008 à 19:10
Tu ne te serais pris le crane pour pas grand chose ?
Aucun besoin de dialogue interprocessus ni fichier.
On met 4 octets du hwnd de la fenetre mère dans le fichier d'échange de Windows et basta. Se lit et s'écrit par FileMapping.
Exemple ici:
UNIQUE INSTANCE PROG (WIN32)
http://www.cppfrance.com/code.aspx?ID=25238
taupe4
Messages postés91Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention17 avril 20081 11 mars 2008 à 17:19
Avec vista cela marche parfaitement, y compris avec vista avec UAC activé, il me semble, car cela n'est pas du code affectant des parties sensibles du système. Je n'ai pas rencontré de cas nécéssitant l'UAC avec ce code.
Et, des moyens moins hardcore de transmettre des messages, c'est assez difficile, selon moi. Si tu n'as besoin que d'avoir instance unique les Mutex sont pour ça (il existe des sources ici qui utilisent cela).
Et, quant à moi, j'ai déjà vu du code bien plus horrible et utilisant les API système à fond: un truc qui permet, en .NET, d'utiliser les «common dialogs» Vista.
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 10 mars 2008 à 20:26
Merci mille fois pour cette source ... c'est ce que je cherchais, exactement.
Un peu dommage que se soit aussi hard, du code unsafe et des api windows ... surtout qu'avec vista et cette maudite UAC ca va peut être pas marcher si ? Il n'y a pas moyen de faire ca de manière plus conventionnelle ?
12 mars 2008 à 01:06
12 mars 2008 à 00:47
Mais bon, avec .NET on n'est plus à ça près.
11 mars 2008 à 23:22
11 mars 2008 à 23:15
Est-ce que ta source permet le transfert de paramètres comme ceux envoyés par l'éxécutable ? on dirait que non. La première partie est rigoureusement identique à la mienne. Et si c'était juste cela, il existe des mécanismes en .NET qui font cela. Des sources sont d'ores et déjà disponibles sur csharpfr. Mais ma source permet de transférer simplement des chaînes de caractères vers l'instance unique en utilisant WM_COPYDATA. Dans Paint.NET, cette fonctionnalité est utilisée pour envoyer vers la fenêtre les images qu'on ouvre via l'explorateur windows.
11 mars 2008 à 20:24
11 mars 2008 à 20:18
11 mars 2008 à 20:15
HWND c'est le handle de fenêtre, le descripteur unique de chaque fenêtre.
11 mars 2008 à 20:08
@BruNews : Moi j'ai une question bête c'est quoi le hwnd ? c'est peu être con mais je ne sais pas ce que c'est. Ta source cpp est transposable en .net ? J'avoue plus trop bien me souvenir du c++, j'en ai pas fait longtemps ;)
11 mars 2008 à 19:10
Aucun besoin de dialogue interprocessus ni fichier.
On met 4 octets du hwnd de la fenetre mère dans le fichier d'échange de Windows et basta. Se lit et s'écrit par FileMapping.
Exemple ici:
UNIQUE INSTANCE PROG (WIN32)
http://www.cppfrance.com/code.aspx?ID=25238
11 mars 2008 à 17:19
Et, des moyens moins hardcore de transmettre des messages, c'est assez difficile, selon moi. Si tu n'as besoin que d'avoir instance unique les Mutex sont pour ça (il existe des sources ici qui utilisent cela).
Et, quant à moi, j'ai déjà vu du code bien plus horrible et utilisant les API système à fond: un truc qui permet, en .NET, d'utiliser les «common dialogs» Vista.
10 mars 2008 à 20:26
Un peu dommage que se soit aussi hard, du code unsafe et des api windows ... surtout qu'avec vista et cette maudite UAC ca va peut être pas marcher si ? Il n'y a pas moyen de faire ca de manière plus conventionnelle ?