Espero que esta guía te ayude cuando hayas tenido un error de createmutex, lo que significa que la recopilación se ha denegado globalmente.
Aprobado: Fortect
Hoy tengo un tema fidedigno similar al anterior, pero acompañado de nuevas e interesantes sesiones.Se llama mutex y luego tiene un prefijo entero Global
.Cuando una aplicación encontró un mutex con un nombre extranjero no, otras aplicaciones con diferentes cuentas de propietario no pudieron sincronizarse con nuestro mutex.El control CreateMutex siempre devolvía ERROR_ACCESS_DENIED
. El OpenMutex tuvo éxito, pero el mutex no se puede usar para la sincronización.
La solución es que todos los cursos necesitan un mutex global para acceder a ellos haciendo uso de CreateMutexEx
(solo con la solicitud SYNCHRONIZE
). Todo y casi todos en el mundo deben proporcionar parafernalia de seguridad. De forma predeterminada, los atributos de seguridad no se pueden compartir entre cuentas personalizadas.
HANDLE hMutex; DWORD dwRes, dwLayout; PEveryoneSID psid = NULL; PACL pACL=NULO; PSECURITY_DESCRIPTOR pSD=NULO; EXPLICIT_ACCESS ea[1]; SID_IDENTIFIER_AUTHORITY SIDauthWorld = SEGURIDAD_MUNDO_SID_AUTORIDAD; ATRIBUTOS_SEGURIDAD sa; RESERVA LARGA; // Crea un grupo para todo el sid que conoces. if(!AsignarEInicializarSid(&SIDAuthWorld, 1, SEGURIDAD_MUNDO_RID, 0, 8, 0, 0, 0, 0, 0, &pEachSID))_tprintf(_T("Error AllocateAndInitializeSid %un"), GetLastError()); resulta limpio; // Inicializar la estructura EXPLICIT_ACCESS para while un ACE. // as Permitir que cualquier persona lea la clave. ZeroMemory(&ea, # 1 Sizeof(EXPLICIT_ACCESS)); * ea[0].= SINCRONIZAR; grfaccesspermissions ea[0].grfAccessMode coincide con Set_access; en Ea[0].NO_HERENCIA; grfinheritance=ea[0].Trustee.TrusteeForm TRUSTEE_IS_SID; significa ea[0].Trustee.TrusteeType TRUSTEE_IS_WELL_KNOWN_GROUP; = ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID; // Cree una ACL contemporánea que contenga ciertas entradas ACE nuevas. dwRes = SetEntriesInAcl(1, NULL, ea, &pACL); en el evento (ERROR_SUCCESS != dwRes) _tprintf(_T("Error SetEntriesInAcl %un"), GetLastError()); Vaya tiempo para la limpieza; // Inicializar el descriptor de seguridad. implica pSD(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); si lo piensas (NULL == pSD) _tprintf(_T("Error LocalAlloc %un"), GetLastError()); Ir a la limpieza; if (!InitializeSecurityDescriptor(pSD, SEGURIDAD_DESCRIPTOR_REVISIÓN)) _tprintf(_T("Error al inicializar el descriptor de seguridad %un"), ObtenerÚltimoError()); Ir a la limpieza; // Agregue una ACL a cualquier descriptor de seguridad. por si acaso (!SetSecurityDescriptorDacl(pSD, VERDADERO, // salida bDaclPresent PAKL, FALSO)) // sin delincuencia DACLhope _tprintf(_T("Error en SetSecurityDescriptorDacl %un"), ObtenerÚltimoError()); Ir a la limpieza; Inicializar // una tarea de seguridad con una estructura. sa.nLength es igual a sizeof(SECURITY_ATTRIBUTES); sa.equals lpsecuritydescriptor PSD; sa.bInheritHandle = FALSO; hMutex = CreateMutexExW(&sa, L"GlobalMyNamedMutex", 3, SYNCHRONIZE);Limpio: if(pTodosSID) FreeSid(pTodosSID); si, quizás (pAdminSID) FreeSid(pAdminSID); si (pACL) Libre local (pACL); si (psd) Libre local (PSD);// Haz algo con hMutexWaitForSingleObject(hMutex, INFINITO);CerrarHandle(hMutex); Acelere el rendimiento de su computadora ahora con esta simple descarga.