14 Stimmen

Übergabe eines nullbaren Typs an eine P/invozierte Funktion

Ich habe ein paar p/aufgerufene Funktionen (aber ich bin meinen Code im Moment neu schreiben, so dass ich aufräumen) und ich möchte wissen, wie zu verwenden/übergeben einen nullable Typ als einer der Parameter. arbeiten mit int-Typen ist kein Problem, aber angesichts der folgenden:

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

Ich würde gerne die Möglichkeit haben, die Guid Parameter als nullbaren Typ. Wie es im Moment steht, kann ich es als aufrufen:

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

aber ich brauche den ersten Parameter, der auch als null .

11voto

JaredPar Punkte 699699

Es ist nicht möglich, einen Nullable Typ in eine PInvoke'd Funktion ohne einige ... interessante Byte-Manipulation in nativen Code, die fast sicher nicht, was Sie wollen übergeben.

Wenn Sie die Möglichkeit benötigen, einen struct-Wert als NULL an nativen Code zu übergeben, deklarieren Sie eine Überladung Ihrer PInvoke-Deklaration, die einen IntPtr anstelle des struct nimmt und IntPtr.Zero übergibt

[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);

Hinweis: Ich habe der ersten Signatur eine ref-Klasse hinzugefügt. Wenn die native Signatur NULL annehmen kann, handelt es sich wahrscheinlich um einen Zeigertyp. Daher müssen Sie Werttypen per Referenz übergeben.

Jetzt können Sie Anrufe wie die folgenden tätigen

if (enumerator.HasValue) { 
  SetupDiGetClassDevs(someGuid, ref enumerator.Value, hwnd, flags);
} else {
  SetupDiGetClassDevs(someGuid, IntPtr.Zero, hwnd, flags);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X