13

我有一些 p/invoked 函数(但我现在正在重写我的代码,所以我正在整理)并且我想知道如何使用/传递一个可空类型作为参数之一。使用 int 类型不是问题,但考虑到以下情况:

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, int? enumerator, IntPtr hwndParent, uint Flags);

我希望能够将Guid参数作为可空类型传递。就目前而言,我可以将其称为:

SetupDiGetClassDevs(ref tGuid, null, IntPtr.Zero, (uint)SetupDiFlags.DIGCF_PRESENT );

但我需要第一个参数也可以作为null.

4

1 回答 1

11

如果没有一些......有趣的本机代码中的字节操作,就不可能将 Nullable 类型传递给 PInvoke 函数,这几乎肯定不是您想要的。

如果您需要将结构值作为 NULL 传递给本机代码的能力,请声明 PInvoke 声明的重载,该声明采用 IntPtr 代替结构并传递 IntPtr.Zero

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, ref int enumerator, IntPtr hwndParent, uint Flags);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, IntPtr enumerator, IntPtr hwndParent, uint Flags);

注意:我在第一个签名中添加了一个 ref 类。如果本机签名可以取 NULL,则很可能是指针类型。因此,您必须通过引用传递值类型。

现在您可以拨打如下电话

if (enumerator.HasValue) { 
  SetupDiGetClassDevs(someGuid, ref enumerator.Value, hwnd, flags);
} else {
  SetupDiGetClassDevs(someGuid, IntPtr.Zero, hwnd, flags);
}
于 2009-06-26T15:11:59.933 回答