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.
___________________________________________________________
MagicalementNono