2009-01-28 7 views
4

J'utilise boost :: interprocess pour communiquer entre deux applications. Lorsque les deux applications sont lancées par le même utilisateur, cela fonctionne très bien.boost :: interprocess entre le service Windows et l'application utilisateur

Lorsque l'une des applications est un service, elle échoue.

J'ai trouvé que le média partagé est en fait un fichier qui est créé dans le répertoire "TMP". Il échoue donc car chaque application crée son propre fichier dans son propre répertoire "TMP". Peut-être que je ne l'utilise pas le bon moyen pour mon but particulier.

Est-ce que quelqu'un a une idée de comment résoudre mon problème?

Merci beaucoup,

Nic


EDIT: J'essayé d'utiliser "managed_mapped_file". Mon problème est que l'implémentation win32 appelle "CreateFileMapping" sans spécifier de nom pour l'objet. Dans mon cas particulier, je pense que je dois spécifier quelque chose comme "Global \ MyMappedFile" afin que l'application et le service puissent voir le fichier mappé.

+0

Bonjour, je suis confronté à un problème très similaire et j'apprécierais vraiment un peu plus d'explications sur ce sujet, puisque je suis totalement nouveau pour boost :: interprocess et je n'ai trouvé aucun exemple d'utilisation de managed_windows_shared_memory dans le web. Merci. Edit: Je travaille sous Windows Vista. –

Répondre

4

Voici quelque chose qui fonctionne:

  • J'utilise "boost :: :: interprocessus managed_windows_shared_memory"
  • Le nom de ma section "Global \ MySharedMemory"
  • Je gérer le cas où l'application est démarrée et le service non. En effet, même si mon application peut avoir un accès en lecture/écriture à la mémoire partagée, elle ne peut pas le créer. Seul le service peut. (En fait, l'application peut si et seulement si l'utilisateur en cours d'exécution, il a un privilège spécial SeCreateGlobalPrivilege)

Peut-être que quelqu'un peut trouver une meilleure façon ;-)

Nic

1

c'est quelque chose à propos des stations Windows et ACL. vous devez modifier la source pour qu'elle fonctionne entre le service Windows et l'application utilisateur. dans Vista et win7, services exécutés à winsta0, mais les applications à winsta1. Vous devez donc donner un LPSECURITY_ATTRIBUTES avec la bonne DACL.

Questions connexes