Le code suivant fonctionne parfaitement bien sur mon machine XP SP2, mais l'appel à WaitForSingleObject attend indéfiniment lors de l'exécution sur ma machine Vista:WaitForSingleObject obtient son sémaphores dans XP, mais pas dans Vista
HANDLE ghSemaphore;
ghSemaphore = CreateSemaphore(NULL, 0, 1, "COM_PHILOERTEL_FINA");
if (ghSemaphore == NULL) {
MessageBoxA(NULL,"Error creating semaphore","ERROR",0);
return FALSE;
}
MessageBoxA(NULL,"Semaphore created. Waiting for it to be triggered","ERROR",0);
WaitForSingleObject(ghSemaphore, INFINITE);
// got the semaphore, ready to rock
MessageBoxA(NULL,"Got the semaphore, ready to rock!","Notice",0);
est ici le fil qui libère le sémaphore:
ghSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "COM_PHILOERTEL_FINA");
if (ghSemaphore == NULL) {
MessageBoxA(NULL,"Failed to open semaphore","ERROR",0);
return FALSE;
}
if (0 == ReleaseSemaphore(ghSemaphore, 1, NULL)) {
MessageBoxA(NULL,"Plugin was unable to release the semaphore","ERROR",0);
return FALSE;
}
Le sémaphore nommé était un ajout récent qui ne faisait rien de bon. Avant cela, les discussions ne faisaient que partager ghSemaphore avec son sémaphore anonyme. Pas de différence apparente. Est-ce que quelqu'un a une idée pourquoi ce binaire (compilé sur la machine XP dans VC6, Express Edition fwiw) ne fonctionnerait pas dans Vista? Comme je l'ai dit plus haut, l'appel WaitForSingleObject est ce qui ne finit jamais.
THanks!
MSDN dit que ReleaseSemaphore() nécessite attribut de sécurité SEMAPHORE_MODIFY_STATE. Vous utilisez NULL comme paramètre pour l'attribut de sécurité dans CreateSemaphore(). Pouvez-vous essayer une fois avec cet ensemble d'attributs de sécurité? – Naveen
@Naveen, une fois que le 'OpenSemaphore' réussit (et il fait apparemment comme le PO remarquerait probablement autrement), le handle * a * le droit d'accès SEMAPHORE_MODIFY_STATE. – avakar
@philo, le code fonctionne bien pour moi sur Vista, même lorsque je mets les extraits dans des processus distincts. Y a-t-il quelque chose de spécial dans votre processus ou s'agit-il d'une application normale non étalonnée? – avakar