LONG CGeiOfficeCtrl::Ouvrir(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO : ajoutez ici le code de votre gestionnaire de dispatch return GEI_Open(); }
int GEI_Open(){ if (!opened){ try{ #if (defined BOOST_WINDOWS) && !(defined BOOST_DISABLE_WIN32) // ne chercher à supprimer la mémoire partagée coté client que dans le // cas de Windows boost::interprocess::shared_memory_object::remove("GEI_SharedMemory"); #endif // ouverture de la mémoire partagée segment = new boost::interprocess::managed_shared_memory (boost::interprocess::open_only, "GEI_SharedMemory"); // trouver les éléments dans la mémoire partagée shd.mutex = segment->find<Mutex>("mutex").first; shd.cond = segment->find<Condition>("cond").first; shd.update = segment->find<bool>("update").first; shd.units = segment->find<MapUnits>("units").first; shd.coalitions = segment->find<VectUnits>("coalitions").first; shd.pendingCommand = segment->find<Commands>("pendingCommand").first; shd.mapSize = segment->find<GEI_Pos>("mapSize").first; shd.startPosition = segment->find<GEI_Pos>("startPosition").first; shd.buildingLand = segment->find<VectPos>("buildingLand").first; } catch (...){ std::cerr << "GEI_Open : open shared memory error" << std::endl; delete segment; segment = NULL; #if (defined BOOST_WINDOWS) && !(defined BOOST_DISABLE_WIN32) // ne chercher à supprimer la mémoire partagée coté client que dans le // cas de Windows boost::interprocess::shared_memory_object::remove("GEI_SharedMemory"); #endif return -11; } /* indiquer que les données locales n'ont pas été renseignées */ refreshed = false; ld.units = NULL; for (int i = 0 ; i < NB_COALITIONS ; i++) ld.coalitions[i] = NULL; ld.buildingLand = NULL; /* validation de l'ouverture */ opened = true; return 0; } else{ if (GEI_Close() < 0){ std::cerr << "GEI_Open : GEI already opened, impossible to reload GEI" << std::endl; return -6; } // réouverture de la GEI return GEI_Open(); } }