我正在使用Visual Studio C ++ 2010进行编码,而我正在使用Global\
创建CreateMutex()
互斥锁。你可以这样使用CreateMutex()
:
CreateMutex(NULL, FALSE, NULL);
第一个参数是安全属性。
我知道您可以创建自己的安全属性:
SECURITY_DESCRIPTOR sDescriptor;
InitializeSecurityDescriptor(...);
SetSecurityDescriptorDacl(...);
SECURITY_ATTRIBUTES sAttribute;
// set sAttribute's fields
...
...
...
CreateMutex(sAttribute, FALSE, NULL);
我的问题是我并不真正了解为什么在制作互斥锁时需要创建自己的安全描述符和属性。我的问题是:
NULL
)与创建您自己的安全属性之间的真正区别是什么?有关进一步的讨论,在服务中使用默认安全属性(如CreateMutex(NULL, FALSE, NULL);
)创建互斥锁并尝试从服务外部的用户应用程序中使用OpenMutex(MUTEX_ALL_ACCESS, FALSE, NULL);
打开相同的互斥锁时,从OpenMutex()
ERROR_ACCESS_DENIED
获取错误5。添加创建的安全性属性时,可以从用户应用程序成功打开互斥锁。
这是为什么?我的理论是因为服务在会话0中运行,而所有其他应用程序在不同的会话中运行,因此安全属性必须为零。但我并不能真正理解制作安全属性或使用默认属性之间的区别。我在想正确的方向吗?