Meilleur auteur de réponses
MemoryMappedFile entre un service Windows et une application Console

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.
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
Toutes les réponses
-
Bonjour
Essayez de creer un MemoryMappedViewAccessor
Bien cordialement,var view =
oMemoryMappedFile.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read);
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. -
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));
-
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. -
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. -
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