2008-11-28 3 views
2

Peut-être que cela ne peut pas être fait, mais s'il vous plaît aider ou suggérer comment cela peut être réalisé sans écrire quelque chose sur le disque.Comment écrire des informations sur une «variable globale (in-memory)» de Windows qui peut être partagée par diverses applications, en utilisant des API Windows?

Supposons qu'il existe deux valeurs de chaîne que je veux partager entre deux applications indépendantes.

Vous pouvez fournir un exemple de code dans n'importe quel langage de programmation.

+0

Encore une autre ligne ridiculement longue. S'il vous plaît, gardez le sujet court et posez la question dans le * corps *! – JesperE

Répondre

5

Ce que vous voulez probablement faire est de créer un fichier mappé en mémoire. Vous pouvez créer un fichier mappé en mémoire qui ne possède aucun magasin de sauvegarde sur le disque, mais qui est plutôt sauvegardé par le fichier de page système. Jetez un oeil à la documentation pour CreateFileMapping, en particulier lorsque le premier paramètre est INVALID_HANDLE_VALUE.

Vous pouvez attribuer un tel nom de fichier à un nom de système unique, puis d'autres applications peuvent l'ouvrir en utilisant OpenFileMapping et en fournissant le même nom.

Une fois que vous avez un tel bloc de mémoire partagée, vous pouvez mettre toute information que vous aimez dedans. Notez que puisque la mémoire est partagée entre les processus, vous ne voulez pas stocker de pointeurs dans le bloc de mémoire (ce qui empêche de faire des choses telles que l'enregistrement d'un std::string).

3

L'approche recommandée consiste à créer un mappage de mémoire nommé (CreateFileMapping, probablement avec INVALID_HANDLE_VALUE comme premier paramètre car vous n'avez pas besoin d'un fichier réel) et à mettre vos données partagées dans le mappage. Vous aurez également besoin d'un mutex nommé pour synchroniser l'accès à ces données.

Une approche paresseuse consiste à utiliser #pragma data_seg (pour MSVC, d'autres compilateurs ont des outils similaires) pour mettre vos données dans une section partagée. Veuillez noter que MSVC nécessite que les données soient explicitement initialisées; sinon, il ira à la section des données régulières sans même un avertissement.

L'inconvénient de la seconde approche est que la sécurité n'est pas appliquée ici, de sorte que tout utilisateur (même entre sessions) aura accès à la section partagée. Un autre problème est que seules les instances du même fichier exécutable (ou DLL) partageront la section; c'est-à-dire que si vous copiez un fichier .exe et que vous l'exécutez à partir de deux emplacements différents, les données ne seront pas partagées.

+0

+1 pour l'avertissement d'initialisation explicite. J'ai été mordu par ça plusieurs fois. – gooli

Questions connexes