На самом деле, это неправильный способ сортировки HANDLE *
. Это будет работать, но не будет надежным перед лицом исключений.
Функция, которую вы опубликовали, выглядит как функция создания объекта (она обрабатывает hpDevice
как выходной параметр и возвращает int
результат состояния).
Правильный способ маршалинга зависит от того, какой именно тип объекта он создает и как он закрывается. Предполагая, что HANDLE
закрывается путем вызова CloseHandle
(что верно для большинства , но не для всех HANDLE
объектов), тогда вы, вероятно, можете использовать один из типов, наследуемых от SafeHandleZeroOrMinusOneIsInvalid
. Например, если объект является разделом реестра, используйте SafeRegistryHandle
; если это файл, тогда используйте SafeFileHandle
.
Если это какой-то тип, для которого нет существующего типа безопасного дескриптора (но для его закрытия используется CloseHandle
), вам придется определить свой собственный тип безопасного дескриптора, полученный из SafeHandleZeroOrMinusOneIsInvalid
. Если это какой-то тип, который не использует CloseHandle
, чтобы закрыть его, вам придется определить свой собственный безопасный тип дескриптора, полученный из SafeHandle
.
Как только вы определили правильный SafeHandle
-приведенный тип, вы можете использовать его в вызове функции (используя SafeFileHandle
в качестве примера):
[DllImport("myapi.dll")]
public static extern int myFunct(
[MarshalAs(UnmanagedType.LPTStr)] string lpDeviceName,
out SafeFileHandle hpDevice);