代码之家  ›  专栏  ›  技术社区  ›  Alvaromon

如何在C#[重复]中传递作为结构的可选参数

  •  3
  • Alvaromon  · 技术社区  · 7 年前

    所以我遇到了这种不幸的情况,正如标题所说,我必须用可选的 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!!] );
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   River Marcus Downing    7 年前

    为此,您应该将第三个参数声明为 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);
    }