File mapping

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 12 oct. 2006 à 19:44
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011 - 19 sept. 2008 à 10:59
Bonsoir / Bonjour à tous,

Voila j'ai trouvé l'exelente source de BruNews concernant les instance unique de programme. Plutot que de recopier bêtement la fonction, je cherche à la comprendre, j'ai compris en gros le comment, mais pas ds les détails et cela ... je n'aime pas. Donc voice mes questions lol.

- Opens a named file mapping object. "file mapping object " késako ?

- Qu'est ce que le FileMapping ? j'ai vaguement compris sur la msdn, que ces fonction permettent de renvoyer un pointeur sur une zonne mémoire, mais que contient la zone mémoire, ça je ne l'ai pas très bien compris, les instructions ? , le contenut de l'exe ?

- hwnd = (HWND) *((DWORD*) pmem); , j'ai compris que hwnd pointe maintenant sur la zone mémoire crée par le mapping, mais cela sert à quoi ?

Voice la fonction entière pour celui qui aurait le courage de bien me l'expliquer (en gras, les ligne que je ne comprend pas bien)

int __stdcall IsMappedSysApp(char *szname)
{
  HANDLE hmap;
  LPVOID pmem;
  HWND hwnd;
  hmap = OpenFileMapping(FILE_MAP_READ, 0, szname);
  if(!hmap) return 0;
  pmem = MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, 0);
  if(!pmem) goto closeMap;
  hwnd = (HWND) *((DWORD*) pmem);
  UnmapViewOfFile(pmem);
  if(IsWindow(hwnd)) {
    hwnd = GetLastActivePopup(hwnd);
    if(IsIconic(hwnd)) ShowWindow(hwnd, SW_RESTORE);
    SetForegroundWindow(hwnd);
  }
closeMap: CloseHandle(hmap);
  return 1;
}

-

++
deck_bsd

[http://deck-bsd.eurower.net]

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2006 à 02:03
FileMapping, tu peux considérer cela comme un "flux" nommé dont la la source sera un fichier précis ou alors le fichier d'échange du système si tu ne précises pas de fichier.

OpenFileMapping: retourne un handle sur un objet noyau nommé, même principe qu'un mutex par exemple. Retournera 0 si nom n'est pas dans la table de handles ou accès refusé.

MapViewOfFile: mape une vue des données dans l'espace mémoire de l'appelant, si réussite retournera pointeur sur cette adresse mémoire.

hwnd = (HWND) *((DWORD*) pmem);
Là ce n'est (hormis le type Win HWND) que du simple C, on lit 4 octets depuis l'adresse pmem.
En plus verbeux, on écrirait:
DWORD *pdw;
DWORD v;
pdw = (DWORD*) pmem; // Un pointeur DWORD à l'adresse pmem
v = *pdw;

ciao...
BruNews, MVP VC++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
14 oct. 2006 à 15:31
Si j'ai bien compris ;)

Ici vu que l'on ne spécifie pas un nom de fichier , mais le nom de l'application, il va allez voir ds la table des handle apres celui de l'application et va retourner un l'handle de l'application c'est ça ?

Et puis OpenFileMapping va renvoié un poiteur sur la zone mémoire du handle c'est bien cela?

++
deck_bsd

[http://deck-bsd.eurower.net]
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 oct. 2006 à 15:45
OpenFileMapping retournera non pa un "handle de l'application" mais un handle sur un FileMapping s'il y en a un nommé existant avec ce nom.
C'est MapViewOfFile qui donne pointeur sur zone mémoire, normal puisque c'est elle qui charge en page RAM.

ciao...
BruNews, MVP VC++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
14 oct. 2006 à 16:03
heu oui MapViewOfFile :s je sais pas pk j'ai dit OpenFileMapping :s ok , j'ai compris l'astuce :D ici on vérifie juste si il y a déjà un FileMapping avec le nom de l'application. Je voi ici a quoi il sert mais sinon le FileMapping, c'est quoi sont intéret ?

++
deck_bsd

[http://deck-bsd.eurower.net]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
19 sept. 2008 à 10:59
J'avais également repris cette fonction il y a quelques années,
et l'avais fait un poil évoluer.
les commentaires détaillés sont complétés en fonction de ce qui a été dit plus haut...

si ça peut être utile à quelqu'un

    bool __stdcall BUniq::exist(    
#ifdef WINCE
        LPCTSTR //WINCE fonctionne en unicode...
#else
        const char *
#endif
        szname , HWND * pHwnd )
    {
/// ------------------------------------------------------------------------------------------
/// ---------------- BXXX::BUniq::exist(LPCTSTR szname ,HWND* pHwnd) -> bool  ----------------
/// ------------------------------------------------------------------------------------------
/// -----  Objectif    : vérifier si une fenetre de ce nom n'est pas déjà instancié.
/// -----  explic    : ie déjà enregistré & tjs lancé
/// -----  Auteur(s)    : BruNews 07/08/04 - MagicNono 27/10/05
/// -----  PreCond    : /
/// -----  PostCond    : si le prog était déjà instancié, il est ramené au premier plan
/// -----  Etat        : 1            (-1<0<1<2)
/// -----  Nota        : nom originel : IsMappedSysApp
/// -----  MaJ 27/10/05 : réécriture en supprimant le goto - BCE
/// -----  MaJ 03/12/05 : retour du handle, optionnellement - BCE
/// ------------------------------------------------------------------------------------------
/// -----  LPCTSTR szname    : nom unique de l'appli ou MagicNumber associé (GUID)
/// -----  HWND* pHwnd    : optionnel : Handle de l'appli, en retour.
/// ------------------------------------------------------------------------------------------
/// -----  retour (bool )    : ok, exec autorisée
/// ------------------------------------------------------------------------------------------
        HANDLE hmap = OpenFileMapping( FILE_MAP_READ , 0 , szname );
        //    retourne un handle sur un objet noyau nommé, (handle sur un FileMapping, pas sur appli)
        //+    même principe qu'un mutex par exemple.
        //+    Retournera 0 si nom n'est pas dans la table de handles ou accès refusé.

        if( !hmap )
            return false;
        LPVOID pmem = MapViewOfFile( hmap , FILE_MAP_READ , 0 , 0 , 0 );    //mape une vue des données dans l'espace mémoire de l'appelant,
        //+    si réussite retournera pointeur sur cette adresse mémoire
        //+ en l'occurence, ptr sur RAM chargée, par la filemapping
        if( pmem )
        {
            HWND hwnd = ( HWND ) * ( ( DWORD * ) pmem );// lit 4 octets depuis l'adresse pmem.
            UnmapViewOfFile( pmem );
            if( IsWindow( hwnd ) )
            {
                hwnd = GetLastActivePopup( hwnd );
                if( IsIconic( hwnd ) )
                    ShowWindow( hwnd , SW_RESTORE );
                ShowWindow( hwnd , SW_SHOW );    //gestion du cas: caché ds la systray
                SetForegroundWindow( hwnd );
                if( pHwnd )
                    *pHwnd = hwnd;
#ifdef SON_OK
                sndPlaySound( "Maximize" , SND_NODEFAULT );
#endif /* SON_OK */

            }
        }
        CloseHandle( hmap );
        return true;
    }

Nota au passage, pour WINCE,
OpenFileMapping
n'était pas défini et ai dut le réimplémenter.

___________________________________________________________
Magicalement
Nono
0
Rejoignez-nous