OVH Cloud OVH Cloud

Faire communiquer deux programmes entre eux ?

15 réponses
Avatar
Vincent
Bonjour,

Je désire faire communiquer deux programmes, un envoi des ordres l'autre les
exécute.
les messages seraient du genre GO, SUPP 123, RECUPID ......

Il s'agit précisement, de faire communiquer un service windows que je
développe et
une ihm ( le 2eme programme). L'ihm pose des questions au service, ce
dernier repond .....

Existe-il une méthode particulière ? échanche de messages windows ? com
entre threads ?

Merci pour vos infos

Vincent

ps :

est-il possible de donner des droits à une application alors que
l'utilisateur de la session ne les a pas ?

5 réponses

1 2
Avatar
Arnaud CLERET
Je suis d'accord sur le fait que Remoting est lié à .Net et ne permettra
donc pas d'être interopérable avec d'autre technologies.
Du coup la solution de la file MSMQ ou de la base de données me semble être
le mieux. Je reste sur ma position que l'implémentation de la communication
par socket reste bien plus compliquée à implémenter et sera certainement
source de plus d'erreur. Et je ne parle même pas des problèmes de sécurité
et d'authentification ...

--
arno - http://www.dotnetguru2.org/acleret/

"Delf" a écrit dans le message de news:
4434b674$0$18264$
Arnaud CLERET wrote:

Non c'est tout à fait ça avec des possibilité dans les choix
d'instantiation des objets exposés par le serveur au client, de
récupération de référence ou de valeur, de traitement "oneway" ...
En plus, il peut être géré au travers d'un service windows comme pour le
cas de Vincent au travers de TCP par sérialisation binaire ou SOAP mais
aussi au travers de Http par un hébergement au sein de IIS.



Pour ma part, vu ce que veut faire Vincent, je lui conseillerais
l'utilisation de socket. CA lui permettrait par la suite, on ne sait
jamais, de créer des clients sous d'autres environnements/langages.

Avec du Remoting, j'ai bien qu'il soit bloqué...

--
Delf
Do not use this email in Cc!
A New York les taxis sont jaunes, à Londres ils sont noirs et à Paris ils
sont cons.


Avatar
Vincent
Je désire faire simple.
Mon problème au départ ( sous windows 2000 ) est que mon programme exécute
un : CreateFile de kernel32.dll
quand je suis admin tout est ok. Mais avec un utilisateur classique ca
marche pas car il a pas les droits !

Sur ce, je me suis dit : soit le programme a des droits particulier même si
l'utilisateur ne les a pas !
sauf que je sais pas faire !!!

soit y a un service windows qui a les droits ( car appartenant à admin ) et
qui fait le createfile à la place du programme
(quand ce dernier le lui demande )

mon objectif serait que le programme envoi un message windows du style GO1
( WM_Message ou équivalent ), quand le service voit
passer ce message il sait ce qu'il a à faire et il envoi à son tour un
message du style OKGO1.

Ca existe toujours les messages windows :) ?

Vincent


"Arnaud CLERET" a écrit dans le message
de news:
Je suis d'accord sur le fait que Remoting est lié à .Net et ne permettra
donc pas d'être interopérable avec d'autre technologies.
Du coup la solution de la file MSMQ ou de la base de données me semble
être le mieux. Je reste sur ma position que l'implémentation de la
communication par socket reste bien plus compliquée à implémenter et sera
certainement source de plus d'erreur. Et je ne parle même pas des
problèmes de sécurité et d'authentification ...

--
arno - http://www.dotnetguru2.org/acleret/

"Delf" a écrit dans le message de news:
4434b674$0$18264$
Arnaud CLERET wrote:

Non c'est tout à fait ça avec des possibilité dans les choix
d'instantiation des objets exposés par le serveur au client, de
récupération de référence ou de valeur, de traitement "oneway" ...
En plus, il peut être géré au travers d'un service windows comme pour le
cas de Vincent au travers de TCP par sérialisation binaire ou SOAP mais
aussi au travers de Http par un hébergement au sein de IIS.



Pour ma part, vu ce que veut faire Vincent, je lui conseillerais
l'utilisation de socket. CA lui permettrait par la suite, on ne sait
jamais, de créer des clients sous d'autres environnements/langages.

Avec du Remoting, j'ai bien qu'il soit bloqué...

--
Delf
Do not use this email in Cc!
A New York les taxis sont jaunes, à Londres ils sont noirs et à Paris ils
sont cons.






Avatar
Mehdi
On Thu, 6 Apr 2006 21:58:02 +0200, Vincent wrote:

soit y a un service windows qui a les droits ( car appartenant à admin ) et
qui fait le createfile à la place du programme
(quand ce dernier le lui demande )

mon objectif serait que le programme envoi un message windows du style GO1
( WM_Message ou équivalent ), quand le service voit
passer ce message il sait ce qu'il a à faire et il envoi à son tour un
message du style OKGO1.

Ca existe toujours les messages windows :) ?



Oui mais il n'y a pas a ma connaissance de maniere managée pour envoyer des
messages windows a d'autres applis sous .NET donc il va falloir faire un
peu d'interop. Ce n'est pas bien compliqué et il y a des exemples partout
sur le net. L'autre probleme est que pour que ton service puisse choper les
messages, il va lui falloir avoir une pompe a messages, ce qu'il n'a pas
par défaut.

A mon avis, .NET Remoting sera de loin la méthode la plus simple pour ton
probleme. C'est tout bete:

1) Tu cree une interface qui définit les méthode que l'appli cliente
souhaite faire executer au serveur et tu la met dans une DLL référencée par
l'appli cliente et ton service Windows. Par exemple:

public interface IServiceHelper
{
void GO1();
int UneAutreMethode(string unParametreQuelconque);
}

2) Dans le service Windows, tu implémente les méthodes de cette interface
(c'est la que tu pourra appeler ton CreateFile). Puis, dans la méthode
OnStart du service, tu aura a écrires 3 lignes de code pour créer un
channel et exposer ton object via .NET Remoting.

3) Dans l'appli cliente, 3 lignes de code pour créer un channel et
récuperer une référence vers l'object hébergé par ton service windows.

Voila c'est tout. L'appli cliente peut maintenant appeler les méthode de
l'interface IServiceHelper comme si elle travaillait avec un object local.
.NET Remoting s'occupe pour toi d'établir et de maintenir la connection
entre les 2 applis, de sérialiser les parametres et valeurs de retour des
fonctions appelées, de sérialiser et transmettre les exceptions...
L'avantage de .NET Remoting par rapport aux messages windows est que tu
peux passer n'importe quel parametres aux fonctions, avoir n'importe quel
valeurs de retour, les exceptions lancée lors de l'execution de la méthode
dans ton service windows sont transmise a l'appli cliente qui peux les
catcher. En fait, du point de vue de l'appli cliente, c'est tout comme elle
travaillait avec un object local "normal" et elle n'a pas a se préocuper du
fait que le boulot est en fait fait par une autre appli (le service
Windows).
Avatar
Arnaud CLERET
J'appui cette solution ! :) De loin la plus simple, la plus robuste et
performante mais certes pas totalement interoperable comme le soulignait
Delf.

--
arno - http://www.dotnetguru2.org/acleret/

"Mehdi" a écrit dans le message de news:
1eh0h0i4m8kyr.nple0lzrto9e$
On Thu, 6 Apr 2006 21:58:02 +0200, Vincent wrote:

soit y a un service windows qui a les droits ( car appartenant à admin )
et
qui fait le createfile à la place du programme
(quand ce dernier le lui demande )

mon objectif serait que le programme envoi un message windows du style
GO1
( WM_Message ou équivalent ), quand le service voit
passer ce message il sait ce qu'il a à faire et il envoi à son tour un
message du style OKGO1.

Ca existe toujours les messages windows :) ?



Oui mais il n'y a pas a ma connaissance de maniere managée pour envoyer
des
messages windows a d'autres applis sous .NET donc il va falloir faire un
peu d'interop. Ce n'est pas bien compliqué et il y a des exemples partout
sur le net. L'autre probleme est que pour que ton service puisse choper
les
messages, il va lui falloir avoir une pompe a messages, ce qu'il n'a pas
par défaut.

A mon avis, .NET Remoting sera de loin la méthode la plus simple pour ton
probleme. C'est tout bete:

1) Tu cree une interface qui définit les méthode que l'appli cliente
souhaite faire executer au serveur et tu la met dans une DLL référencée
par
l'appli cliente et ton service Windows. Par exemple:

public interface IServiceHelper
{
void GO1();
int UneAutreMethode(string unParametreQuelconque);
}

2) Dans le service Windows, tu implémente les méthodes de cette interface
(c'est la que tu pourra appeler ton CreateFile). Puis, dans la méthode
OnStart du service, tu aura a écrires 3 lignes de code pour créer un
channel et exposer ton object via .NET Remoting.

3) Dans l'appli cliente, 3 lignes de code pour créer un channel et
récuperer une référence vers l'object hébergé par ton service windows.

Voila c'est tout. L'appli cliente peut maintenant appeler les méthode de
l'interface IServiceHelper comme si elle travaillait avec un object local.
.NET Remoting s'occupe pour toi d'établir et de maintenir la connection
entre les 2 applis, de sérialiser les parametres et valeurs de retour des
fonctions appelées, de sérialiser et transmettre les exceptions...
L'avantage de .NET Remoting par rapport aux messages windows est que tu
peux passer n'importe quel parametres aux fonctions, avoir n'importe quel
valeurs de retour, les exceptions lancée lors de l'execution de la méthode
dans ton service windows sont transmise a l'appli cliente qui peux les
catcher. En fait, du point de vue de l'appli cliente, c'est tout comme
elle
travaillait avec un object local "normal" et elle n'a pas a se préocuper
du
fait que le boulot est en fait fait par une autre appli (le service
Windows).


Avatar
Vincent
Merci pour ta réponse, je n'avais pas percu l'interet.
Je vais essayer de coder cette methode
c'est un peu le principe RMI en java

Vincent

"Arnaud CLERET" a écrit dans le message
de news: %
J'appui cette solution ! :) De loin la plus simple, la plus robuste et
performante mais certes pas totalement interoperable comme le soulignait
Delf.

--
arno - http://www.dotnetguru2.org/acleret/

"Mehdi" a écrit dans le message de news:
1eh0h0i4m8kyr.nple0lzrto9e$
On Thu, 6 Apr 2006 21:58:02 +0200, Vincent wrote:

soit y a un service windows qui a les droits ( car appartenant à admin )
et
qui fait le createfile à la place du programme
(quand ce dernier le lui demande )

mon objectif serait que le programme envoi un message windows du style
GO1
( WM_Message ou équivalent ), quand le service voit
passer ce message il sait ce qu'il a à faire et il envoi à son tour un
message du style OKGO1.

Ca existe toujours les messages windows :) ?



Oui mais il n'y a pas a ma connaissance de maniere managée pour envoyer
des
messages windows a d'autres applis sous .NET donc il va falloir faire un
peu d'interop. Ce n'est pas bien compliqué et il y a des exemples partout
sur le net. L'autre probleme est que pour que ton service puisse choper
les
messages, il va lui falloir avoir une pompe a messages, ce qu'il n'a pas
par défaut.

A mon avis, .NET Remoting sera de loin la méthode la plus simple pour ton
probleme. C'est tout bete:

1) Tu cree une interface qui définit les méthode que l'appli cliente
souhaite faire executer au serveur et tu la met dans une DLL référencée
par
l'appli cliente et ton service Windows. Par exemple:

public interface IServiceHelper
{
void GO1();
int UneAutreMethode(string unParametreQuelconque);
}

2) Dans le service Windows, tu implémente les méthodes de cette interface
(c'est la que tu pourra appeler ton CreateFile). Puis, dans la méthode
OnStart du service, tu aura a écrires 3 lignes de code pour créer un
channel et exposer ton object via .NET Remoting.

3) Dans l'appli cliente, 3 lignes de code pour créer un channel et
récuperer une référence vers l'object hébergé par ton service windows.

Voila c'est tout. L'appli cliente peut maintenant appeler les méthode de
l'interface IServiceHelper comme si elle travaillait avec un object
local.
.NET Remoting s'occupe pour toi d'établir et de maintenir la connection
entre les 2 applis, de sérialiser les parametres et valeurs de retour des
fonctions appelées, de sérialiser et transmettre les exceptions...
L'avantage de .NET Remoting par rapport aux messages windows est que tu
peux passer n'importe quel parametres aux fonctions, avoir n'importe quel
valeurs de retour, les exceptions lancée lors de l'execution de la
méthode
dans ton service windows sont transmise a l'appli cliente qui peux les
catcher. En fait, du point de vue de l'appli cliente, c'est tout comme
elle
travaillait avec un object local "normal" et elle n'a pas a se préocuper
du
fait que le boulot est en fait fait par une autre appli (le service
Windows).






1 2