La technologie Microsoft Message Queuing (MSMQ) permet à des applications exécutées à des moments différents de communiquer à travers des réseaux et des systèmes hétérogènes, même s’ils sont temporairement déconnectés. MSMQ fournit une livraison des messages garantie, un routage efficace, une sécurité et une messagerie basée sur la priorité. Vous pouvez l’utiliser pour implémenter des solutions à la fois pour des scénarios de messagerie asynchrones et synchrones.

Le composant Windows MSMQ n'est pas installé par défaut en général.
Pour l'installer voir ici

Pour utiliser cette technologie dans Windev, voici deux solutions (il y en a peut être d'autres) :
A - en utilisant l'assemblage dotnet "System.Messaging"
B - en utilisant des objets COMs

Ci-après, deux petits exemples d'utilisation qui ne montrent qu'une infime partie de ce que l'on peut faire avec MSMQ. Ici on ne fait qu'envoyer des messages sur la même machine. Mais on peut envoyer d'autres choses que des messages, par exemple des images, des structures, des objets sérialisés. On peut aussi envoyer sur d'autres machines, etc...

A - Avec dotnet
1 - Création de la file et capture de l'évenement de réception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
QueueLecture est une chaîne=".\Private$\MaFile"
pclMyQueue est un objet MessageQueue dynamique
SI MessageQueue.Exists(QueueLecture) ALORS
    // on affecte la File
    pclMyQueue = new MessageQueue(QueueLecture)
    SINON
    // on crée la File
    pclMyQueue = MessageQueue.Create(QueueLecture)
    FIN
    pclMyQueue:add_ReceiveCompleted(DotNetDélégué("ReceptionCommande","ReceiveCompletedEventHandler"))
    pclMyQueue:BeginReceive()
2 - la procédure de réception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
PROCEDURE ReceptionCommande(src est un MessageQueue ,args est un ReceiveCompletedEventArgs)
    lemessage est un System.Messaging.Message dynamique
 
    lemessage = src:EndReceive(args.AsyncResult)
    lemessage.Formatter = new BinaryMessageFormatter()
    // Affiche les messages reçus dans la File
    Info("Message: " + " Titre: " + lemessage.label + " Corps:" + lemessage.Body)
 
    // Réarme la réception
    src:BeginReceive()
3 - un envoi de message dans la File :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
QueueEcriture est une chaîne=".\Private$\MaFile"
monMessage est un System.Messaging.Message dynamique
SI MessageQueue.Exists(QueueEcriture) ALORS
    pclMyQueue est un objet MessageQueue dynamique=allouer un MessageQueue(QueueEcriture)
    // Enable the AppSpecific field in the messages.
    pclMyQueue.MessageReadPropertyFilter.AppSpecific = True
    // Set the formatter to binary.
    pclMyQueue.Formatter = new BinaryMessageFormatter()
    // Create a simple text message.
    monMessage = allouer un "System.Messaging.Message"("Coucou !!!!", new BinaryMessageFormatter())
    monMessage.Label = "Premier Message";
    pclMyQueue:Send(monMessage)
 
    FIN
B - avec des objets COMs
1 - Envoi de message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Queue est un objet automation dynamique
MonMsmq est un objet automation "MSMQ.MSMQQueueInfo" // créer l'objet dynamique
MonMsmq>>PathName = ".\Private$\MaFileCOM" 
QUAND EXCEPTION DANS
MonMsmq>>Create 
FAIRE 
    // ceci est une supposition
	Info(" MaFileCOM existe déja")
FIN
Queue = MonMsmq>>Open ( 2, 0 ) 
SI Queue>>isOpen ALORS
	 Lemessage est un objet automation "MSMQ.MSMQMessage"
	 Lemessage>>Body = "coucou"
	 Lemessage>>Label = "titre"
	 Lemessage>>Send(Queue)
Queue>>close()
FIN
2 - Réception de messages en asynchrone (par événements)

Dans Déclaration de ProcéduresGlobales de votre projet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TheQueue est un objet Automation dynamique
MonMsmq est un objet Automation "MSMQ.MSMQQueueInfo" // créer l'objet dynamique
MonMsmqEvent est un objet Automation "MSMQ.MSMQEvent" 
LeMessage est un objet Automation dynamique
MonMsmq>>PathName = ".\Private$\MaFileCOM" 
QUAND EXCEPTION DANS
	// on crée la File si elle n'existe pas
	MonMsmq>>Create 
FAIRE 
	// ceci est une supposition
	// Info(" MaFileCOM existe déja")
FIN
TheQueue = MonMsmq>>Open ( 1, 0 ) 
SI TheQueue>>isOpen ALORS	
	AutomationEvénement("TraiteMonMessage" ,MonMsmqEvent , "{D7D6E078-DCCD-11D0-AA4B-0060970DEBAE}",0)	 	
	TheQueue>>EnableNotification(MonMsmqEvent)	
FIN
la procédure globale TraiteMonMessage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
PROCEDURE TraiteMonMessage(src ,curseur )
LeMessage = src>>ReceiveCurrent()
Info("Message : " + LeMessage>>Body)
src>>EnableNotification(MonMsmqEvent)
Il est à noter qu'une fois qu'on a installé MSMQ sur sa machine, on peut voir toutes les Files et les messages dans la console "Gestion de l'ordinateur" (accessible par clic droit sur Ordinateur et faire gérer). Dans Services et Applications, il y a une nouvelle rubrique qui s'appelle "Message Queuing".

Ami calmant, J.P