我正在开展一个项目,我需要PInvoke secur32!AddSecurityPackageA
功能,但我仍然在学习如何手动完成这项工作的细节,并可以使用一些帮助。
以下是我正在使用的参考资料:
这里是我的代码示例,我试图定义结构并调用函数:
[DllImport("secur32.dll", EntryPoint = "AddSecurityPackageA")]
public static extern void AddSecurityPackageA(
ref string pszPackageName,
ref SECURITY_PACKAGE_OPTIONS[] Options
);
[StructLayout(LayoutKind.Sequential, CharSet =CharSet.Ansi)]
public class SECURITY_PACKAGE_OPTIONS
{
public ulong Size;
public ulong Type;
public ulong Flags;
public ulong SignatureSize;
public IntPtr Signature;
}
string dll = @"c:\temp\test.dll";
SECURITY_PACKAGE_OPTIONS[] pkgOpts = new SECURITY_PACKAGE_OPTIONS();
AddSecurityPackageA(ref dll, ref pkgOpts);
我的问题是:
ref
的适当使用,根据MSDN文档,这通常是正确的吗?IntPtr
。这是正确的还是我需要使用unsafe
?谢谢!
一些评论:
W
函数而不是A
函数。您不希望将自己限制为ANSI。这是一个Unicode世界。uint
或int
但你应该检查C ++头文件。ref string
错了。它应该是string
。ref SECURITY_PACKAGE_OPTIONS[]
错了。它不是一个数组。它是指向struct
的指针。由于您将SECURITY_PACKAGE_OPTIONS
声明为类(引用类型),因此可以将ref SECURITY_PACKAGE_OPTIONS[]
替换为SECURITY_PACKAGE_OPTIONS
。unsigned long
是32位,因此它应该是C#中的uint
。IntPtr
是正确的,但是没有解决如何声明数字签名并获得指向它的指针的问题。我认为这个问题的范围不在于我们追踪一个如何做到这一点的例子。