我想为ACCESS_MASK
创建一个枚举,我必须使用 P / Invoke ,但我不知道这种实现的最佳方法是什么。< / p>
1。如果可能的话:
[Flags]
enum ACCESS_MASK : uint
{
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
SYNCHRONIZE = 0x00100000,
// Everything reused in the specific rights ...
}
[Flags]
enum PROCESS_ACCESS_MASK : ACCESS_MASK
{
// ...
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF,
}
2。一切都在一个: (不能使用自动字符串表示)
[Flags]
enum ACCESS_MASK : uint
{
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
SYNCHRONIZE = 0x00100000,
// ...
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF,
}
第3。拆分和重写: (Muuuuch重复代码)
[Flags]
enum PROCESS_ACCESS_MASK : uint
{
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
SYNCHRONIZE = 0x00100000,
// ...
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF,
}
4。拆分并取自基本: (特定枚举对基本值本身一无所知)
[Flags]
enum ACCESS_MASK : uint
{
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
SYNCHRONIZE = 0x00100000,
// Everything reused in the specific rights ...
}
[Flags]
enum PROCESS_ACCESS_MASK : uint
{
// ...
PROCESS_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED | ACCESS_MASK.SYNCHRONIZE | 0xFFFF,
}
您更喜欢哪个选项,还是有更好的ACCESS_MASK
实施方式?
顺便说一句:什么是0x100001文件访问?
编辑:我知道没有枚举继承,ACCESS_MASK : uint
就是这样,但假想的PROCESS_ACCESS_MASK : ACCESS_MASK
就是。
答案 0 :(得分:2)
假设您正在隐藏应用程序其余部分的P / Invoke详细信息,并且ACCESS_MASK
值仅在本地使用,我只是将所有选项放入一个枚举中 - 您的选项2
此外,我会使用FlagsAttribute
标记枚举,以表明它被视为位字段。
答案 1 :(得分:0)
你能做什么:
public enum ACCESS_MASK : uint
{
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
SYNCHRONIZE = 0x00100000,
// Everything reused in the specific rights ...
}
public static class Masks
{
// ...
public const ACCESS_MASK PROCESS_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED | ACCESS_MASK.SYNCHRONIZE | (ACCESS_MASK) 0xFFFF;
}
这样您就可以将枚举保留为首选形式。这得益于Winforms如何在单独的静态类中定义具有特定Color
的{{1}}类。