Spero che questo tipo di guida ti possa essere d’aiuto quando hai eseguito errore createmutex che significa disponibilità negata a livello globale.
Approvato: Fortect
Oggi ho un nuovo tema simile al precedente, ma insieme a nuove entusiasmanti sessioni.Si chiama mutex e ha semplicemente un prefisso intero Global
.Quando un’applicazione ha creato un mutex con un nome straniero no, le applicazioni successive con account di proprietari diversi non possono connettersi al nostro mutex.Il controllo CreateMutex spostava sempre ERROR_ACCESS_DENIED
. L’OpenMutex è riuscito, ma il mutex non può essere utilizzato per la sincronizzazione.
La soluzione è che tutti i software per computer necessitano di un mutex globale per accedervi con CreateMutexEx
(solo con richiesta SYNCHRONIZE
). Tutto e ciascuno nel mondo deve fornire accessori di sicurezza. Per impostazione predefinita, gli attributi di sicurezza non possono essere condivisi tra account account.
MANIGLIA hMutex; DWORD dwRes, dwLayout; PEveryoneSID psid = NULL; PACL pACL=NULL; PSECURITY_DESCRIPTOR pSD=NULL; EXPLICIT_ACCESS ea[1]; SID_IDENTIFIER_AUTHORITY SIDauthWorld = SECURITY_WORLD_SID_AUTHORITY; SECURITY_ATTRIBUTES sa; RISERVA LUNGA; // Crea un gruppo per un sid specifico che conosci. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 8, 0, 0, 0, 0, 0, &pEachSID))_tprintf(_T("Error AllocateAndInitializeSid %un"), GetLastError()); procedere alla pulizia; // Inizializza la struttura EXPLICIT_ACCESS anche come ACE. // asso Consenti a chiunque di leggere la chiave. ZeroMemory(&ea, # 1 Sizeof(EXPLICIT_ACCESS)); * ea[0].= SINCRONIZZA; grfaccesspermissions ea[0].grfAccessMode corrisponde a Set_access; in Ea[0].NO_INHERITANCE; grfinheritance=ea[0].Trustee.TrusteeForm TRUSTEE_IS_SID; è uguale a ea[0].Trustee.TrusteeType TRUSTEE_IS_WELL_KNOWN_GROUP; = ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID; // Crea un ACL più recente contenente alcune nuove voci ACE. dwRes = SetEntriesInAcl(1, NULL, ea, &pACL); nell'evento (ERROR_SUCCESS != dwRes) _tprintf(_T("Errore SetEntriesInAcl %un"), GetLastError()); Vai in pulizia; // Inizializza il descrittore di sicurezza. è uguale a pSD(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); se ci pensi (NULL == pSD) _tprintf(_T("Errore LocalAlloc %un"), GetLastError()); Vai a pulizia; se (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) _tprintf(_T("Errore durante l'inizializzazione del descrittore di sicurezza %un"), GetLastError()); Vai a pulizia; // Aggiunge un ACL a qualsiasi descrittore di sicurezza. per ogni evenienza (!SetSecurityDescriptorDacl(pSD, VERO, // emette bDaclPresent PAKL, FALSE)) // nessuna evasione DACLhope _tprintf(_T("SetSecurityDescriptorDacl %un non riuscito"), GetLastError()); Vai a pulizia; Inizializza // un lavoro di sicurezza per te con una struttura. sa.nLength sarà uguale a sizeof(SECURITY_ATTRIBUTES); sa.equals lpsecuritydescriptor PSD; sa.bInheritHandle = FALSO; hMutex = CreateMutexExW(&sa, L"GlobaleMyNamedMutex", 3, SINCRONIZZA);Pulire: se(pEveryoneSID) FreeSid(pEveryoneSID); in un caso in cui (pAdminSID) FreeSid(pAdminSID); se(pACL) Locale libero (pACL); se (psd) Locale gratuito(PSD);// Fai qualcosa che ha hMutexWaitForSingleObject(hMutex, INFINITE);ChiudiManiglia(hMutex);
Accelera ora le prestazioni del tuo computer con questo semplice download.