2009-06-26 66 views
11

我有几个p/invoked函数(但我正在重写我的代码,因此我正在整理),我想知道如何使用/作为参数之一传递可空类型。在int型的工作是没有问题的,但考虑到以下几点:如何将可空类型传递给P/invoked函数

[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

+1

@River矿呼叫是不是因为这是问路早在2009年违规问题;) – 2017-12-28 01:02:49

+0

新一个是试图创建的这个规范版本问题,更多更通用的解决方案。 – River 2017-12-28 01:08:40

回答

11

不可能将Nullable类型传递到PInvoke的函数中,而没有在本地代码中执行有意义的字节操作,这几乎不是您想要的。

如果你需要传递一个struct价值的能力为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); 
}