deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 2016
-
12 oct. 2006 à 19:44
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 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)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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;
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 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?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 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 ?
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 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.