none
MemoryMappedFile entre un service Windows et une application Console RRS feed

  • Question

  • Bonjour,

    J'ai un problème de mémoire partagée entre mon service Windows et mon application console.

    J'utilise MemoryMappedFile afin de créer cette mémoire partagée.

    Voici mon code côté service (compte : LocalService):

    oMemoryMappedFile = MemoryMappedFile.CreateOrOpen(@"Global\GAMEPAD_MFF", 1, MemoryMappedFileAccess.ReadWriteExecute);
    bool IsmutexCreated;
    oMutex = new Mutex(true, @"Global\MutexMMF", out IsmutexCreated);
    oMutex.ReleaseMutex();

    Et voici mon code côté application console :

    MemoryMappedFile oMemoryMappedFile = MemoryMappedFile.OpenExisting(@"Global\GAMEPAD_MFF", MemoryMappedFileRights.ReadWriteExecute, HandleInheritability.Inheritable);
    Mutex oMutex = Mutex.OpenExisting(@"Global\MutexMMF");

    La création côté service de la mémoire partagée marche bien mais lorsque je cherche à récupérer cette mémoire partagée j'ai l'exception suivante :

    "L'accès au chemin d'accès est refusé."

    Je ne sais pas d'où vient le problème. J'ai réussie à faire une mémoire partagée avec MemoryMappedFile entre deux application console et cela marche parfaitement.

    Auriez-vous une solution à ce problème ?

    Merci d'avance.

    mardi 29 avril 2014 09:12

Réponses

  • J'ai trouvé la solution !

    J'ai du remplacer le "everyone" par new SecurityIdentifier(WellKnownSidType.WorldSid, null) car mon Windows n'est pas en anglais.

    Voici mon code côté service qui crée la MMF (compte : LocalService):

    var security = new MemoryMappedFileSecurity();
                    security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
                    oMemoryMappedFile = MemoryMappedFile.CreateOrOpen(@"Global\GAMEPAD_MMF", 1, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, security, System.IO.HandleInheritability.Inheritable);
    Et mon code côté application console qui accède à la MMF:
    MemoryMappedFile oMemoryMappedFile = MemoryMappedFile.OpenExisting(@"Global\GAMEPAD_MMF", MemoryMappedFileRights.ReadWrite, HandleInheritability.Inheritable);

    • Marqué comme réponse LowZi jeudi 1 mai 2014 21:20
    jeudi 1 mai 2014 21:17

Toutes les réponses

  • Bonjour

    Essayez de creer un MemoryMappedViewAccessor

    var view = oMemoryMappedFile .CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read);
    Bien cordialement,

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 30 avril 2014 07:27
  • Merci de ta réponse.
    Créer un MemoryMappedViewAccessor ne résout pas mon problème car pour créer cette accessor je dois avoir un objet MemoryMappedFile instancié et c'est lors de cette instanciation :

    MemoryMappedFile oMemoryMappedFile = MemoryMappedFile.OpenExisting(@"Global\GAMEPAD_MMF", MemoryMappedFileRights.ReadWrite, HandleInheritability.Inheritable);

    que vient le problème d'accès refusé. 

    J 'ai vu cette solution qui marche pour certain :http://social.msdn.microsoft.com/Forums/en-US/3fa10429-e0d6-4f40-b8b4-b306c6d5e5c4/memorymappedfilecreateoropen-throws-unauthorizedaccessexception-access-to-the-path-is-denied?forum=ncl
    Mais impossible de créer la customSecurity, je tombe sur l'erreur suivante : "Impossible de traduire certaines ou toutes les références d'identité." à la ligne : 

    CustomSecurity.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>("everyone", MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));

    mercredi 30 avril 2014 13:57
  • Si vous essayez avec majuscule: Everyone

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 30 avril 2014 14:12
  • Cela ne change rien malheureusement.

    Je crois bien que le problème vient de la méthode CustomSecurity.AddAccessRule() car si je sépare la ligne en deux comme cela :

    AccessRule<MemoryMappedFileRights> rules = new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>("Everyone", MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);
                    CustomSecurity.AddAccessRule(rules);
    L'exception survient a la deuxième lignes.
    mercredi 30 avril 2014 14:58
  • J'ai trouvé la solution !

    J'ai du remplacer le "everyone" par new SecurityIdentifier(WellKnownSidType.WorldSid, null) car mon Windows n'est pas en anglais.

    Voici mon code côté service qui crée la MMF (compte : LocalService):

    var security = new MemoryMappedFileSecurity();
                    security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
                    oMemoryMappedFile = MemoryMappedFile.CreateOrOpen(@"Global\GAMEPAD_MMF", 1, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, security, System.IO.HandleInheritability.Inheritable);
    Et mon code côté application console qui accède à la MMF:
    MemoryMappedFile oMemoryMappedFile = MemoryMappedFile.OpenExisting(@"Global\GAMEPAD_MMF", MemoryMappedFileRights.ReadWrite, HandleInheritability.Inheritable);

    • Marqué comme réponse LowZi jeudi 1 mai 2014 21:20
    jeudi 1 mai 2014 21:17