Pinvoke Параметры DeviceIoControl
Я работаю над проектом C #, используяDeviceIoControl
, Я проконсультировался с соответствующимиСтраница Pinvoke.net для моей подписи:
[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
public static extern bool DeviceIoControl(
SafeFileHandle hDevice,
EIOControlCode IoControlCode,
[MarshalAs(UnmanagedType.AsAny)]
[In] object InBuffer,
uint nInBufferSize,
[MarshalAs(UnmanagedType.AsAny)]
[Out] object OutBuffer,
uint nOutBufferSize,
out uint pBytesReturned,
[In] IntPtr Overlapped
);
Я никогда не виделаobject
а также[MarshalAs(
UnmanagedType.AsAny
)]
раньше, ноДокументация MSDN звучало многообещающе:
Динамический тип, который определяет тип объекта во время выполнения и маршалирует объект как этот тип. Этот член действителен только для методов вызова платформы.
Мой вопрос: каков «лучший» и / или «правильный» способ использования этой подписи?
Например,IOCTL_STORAGE_QUERY_PROPERTY
ожидаетInBuffer
бытьSTORAGE_PROPERTY_QUERY
структура. Кажется, я должен быть в состоянии определить эту структуру, создатьnew
экземпляр и передать его в мою подпись Pinvoke:
var query = new STORAGE_PROPERTY_QUERY { PropertyId = 0, QueryType = 0 };
DeviceIoControl(..., query, Marshal.SizeOf(query), ...);
Тем не менее, я только что получилSystem.ExecutionEngineException
Делая это, я изменил что-то вроде:
int cb = Marshal.SizeOf(typeof(...));
IntPtr query = Marshal.AllocHGlobal(cb);
...
Marshal.PtrToStructure(...);
Marshal.FreeHGlobal(query);
и это по крайней мере не бросало никаких исключений, когда я назвал это. Это просто очень уродливо, и, тем не менее, огромная боль в заднице. Не может ли маршаллер справиться с копированием данных в / из моих локальных структур, как я надеялся?
Выходные данные иногда могут быть хитрыми, потому что они не являются структурами фиксированного размера. Я понимаю, что маршаллер не может справиться с этим автоматически, и я в порядке с HGlobal и копирую бизнес там, где мне нужно.
Дополнительно:
Этот вопрос сначала выглядело полезным, но в итоге оказалось, что это неверная константа.
Я не против использованияunsafe
строит. (Thefixed
-размерstruct
члены требуют этого.)