13

私はいくつかのp/invoked関数を持っています(しかし、私は現在コードを書き直しているので片付けています)、そしてパラメーターの1つとしてnull許容型を使用/渡す方法を知りたいです。int型の操作は問題ではありませんが、次のようになります。

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

Guidパラメータをnull許容型として渡せるようにしたいと思います。現時点では、次のように呼ぶことができます。

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

しかし、最初のパラメーターもとして渡せるようにする必要がありますnull

4

1 に答える 1

11

Nullable型をPInvokeされた関数に渡すことはできません...ネイティブコードでの興味深いバイト操作は、ほぼ確実にあなたが望むものではありません。

構造体の値をNULLとしてネイティブコードに渡す機能が必要な場合は、構造体の代わりにIntPtrを取り、IntPtr.Zeroを渡すPInvoke宣言のオーバーロードを宣言します。

[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 に答える