Как передать тип с нулевым значением в функцию P/invoked

У меня есть несколько p/вызываемых функций (но я переписываю свой код на данный момент, поэтому я убираю), и я хочу знать, как использовать/передавать тип NULL как один из параметров. работа с типами 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.

Ответ 1

Невозможно передать Nullable-тип в функцию PInvoke'd без каких-либо... интересных манипуляций с байтами в собственном коде, который почти наверняка не то, что вы хотите.

Если вам нужна возможность передать значение 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);
}