如何在 C# 中传递作为结构的可选参数
How to pass an Optional parameter that is a struct in C#
所以我 运行 遇到了这种不幸的情况,正如标题所说,我必须编写一个带有可选 struct
参数的函数声明。
这里是 struct
:
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public int nLength;
public IntPtr lpSecurityDescriptor;
public int bInheritHandle;
}
这是.dll中的函数advapi.dll
:
LONG WINAPI RegSaveKey(
_In_ HKEY hKey,
_In_ LPCTSTR lpFile,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
到目前为止,这是我的声明:
[DllImport("advapi32.dll", SetLastError = true)]
static extern int RegSaveKey(UInt32 hKey, string lpFile, [optional parameter here!!] );
为此,您应该将第三个参数声明为 IntPtr
。
当你想传递它 null 时,给它 IntPtr.Zero
。
如果你想传递一个真实的结构给它,Marshal
结构进入内存 - 即像这样的东西
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
// set anything you want in the sa structure here
IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SECURITY_ATTRIBUTES)));
try {
Marshal.StructureToPtr(sa, pnt, false)
// call RegSaveKey here
} finally {
Marshal.FreeHGlobal(pnt);
}
所以我 运行 遇到了这种不幸的情况,正如标题所说,我必须编写一个带有可选 struct
参数的函数声明。
这里是 struct
:
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public int nLength;
public IntPtr lpSecurityDescriptor;
public int bInheritHandle;
}
这是.dll中的函数advapi.dll
:
LONG WINAPI RegSaveKey(
_In_ HKEY hKey,
_In_ LPCTSTR lpFile,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
到目前为止,这是我的声明:
[DllImport("advapi32.dll", SetLastError = true)]
static extern int RegSaveKey(UInt32 hKey, string lpFile, [optional parameter here!!] );
为此,您应该将第三个参数声明为 IntPtr
。
当你想传递它 null 时,给它 IntPtr.Zero
。
如果你想传递一个真实的结构给它,Marshal
结构进入内存 - 即像这样的东西
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
// set anything you want in the sa structure here
IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SECURITY_ATTRIBUTES)));
try {
Marshal.StructureToPtr(sa, pnt, false)
// call RegSaveKey here
} finally {
Marshal.FreeHGlobal(pnt);
}