声明LSA_UNICODE_STRING
为 aclass
而不是 a struct
。通过这样做,您可以使其成为引用类型。LSA_OBJECT_ATTRIBUTES
这与因为ObjectName
has type的声明相匹配,该类型PLSA_UNICODE_STRING
是指向结构的指针。您确实需要指定LayoutKind.Sequential
何时执行此操作,因为这不是类的默认设置。进行此更改后,您可以将变量设置为null
.
[StructLayout(LayoutKind.Sequential)]
class PLSA_UNICODE_STRING
{
public UInt16 Length;
public UInt16 MaximumLength;
public IntPtr Buffer;
}
您可以采用相同的策略LSA_OBJECT_ATTRIBUTES
来允许将其作为null
.
[StructLayout(LayoutKind.Sequential)]
class PLSA_OBJECT_ATTRIBUTES
{
public uint Length;
public IntPtr RootDirectory;
public PLSA_UNICODE_STRING ObjectName;
public uint Attributes;
public IntPtr SecurityDescriptor;
public IntPtr SecurityQualityOfService;
}
[DllImport("advapi32.dll")]
static extern uint LsaOpenPolicy(
PLSA_UNICODE_STRING SystemName,
PLSA_OBJECT_ATTRIBUTES ObjectAttributes,
uint DesiredAccess,
out IntPtr PolicyHandle
);
请注意,pinvoke.net 上的声明错误地使用SetLastError=true
on LsaOpenPolicy
。这是错误的,因为错误代码会在返回值中返回。我还删除了 to 的设置,PreserveSig
因为true
这是默认设置。他们的声明LSA_OBJECT_ATTRIBUTES
也出现了错误,因为ObjectName
参数的类型LSA_UNICODE_STRING
是结构而不是指向它的指针。
我建议您以极端怀疑的态度对待您在 pinvoke.net 上发现的内容。该网站上的大部分声明都是不正确的。
您询问使用可为空类型的可能性。根据@JaredPar's answer here,这不是一个选择。