Как можно использовать SafeHandle в сигнатуре P / Invoke, которая требует в определенных случаях нулевой указатель?

Надеюсь, это не слишком непонятно для SO, но рассмотрите следующую подпись P / Invoke:

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType,
    IntPtr InputHandle,
    ref IntPtr OutputHandlePtr);

Я бы хотел изменить эту подпись для использования SafeHandles следующим образом:

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType,
    MySafeHandle InputHandle,
    ref MySafeHandle OutputHandlePtr);

Однако согласно MSDN аргумент InputHandle должен быть нулевым указателем, когда аргумент HandleType - это SQL_HANDLE_ENV и ненулевой указатель в противном случае.

Как мне зафиксировать эту семантику в одной подписи P / Invoke? Пожалуйста, включите пример call-site в свой ответ. Мое текущее решение - использовать две подписи.

8
задан davidzarlengo 3 December 2011 в 18:44
поделиться