Esperemos que esto no es demasiado oscura para el SO, pero considere lo siguiente P/Invoke firma:¿Cómo se puede usar un SafeHandle en una firma de P/Invoke que requiere un puntero nulo en ciertos casos?
[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
OdbcHandleType HandleType,
IntPtr InputHandle,
ref IntPtr OutputHandlePtr);
me gustaría rediseñar esta firma a utilizar SafeHandles, de la siguiente manera:
[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
OdbcHandleType HandleType,
MySafeHandle InputHandle,
ref MySafeHandle OutputHandlePtr);
Sin embargo, according to MSDN, el argumento InputHandle debe ser un puntero nulo cuando el argumento HandleType es SQL_HANDLE_ENV y un puntero no nulo en caso contrario.
¿Cómo capturo esa semántica en una sola firma de P/Invocar? Incluya un ejemplo de sitio de llamadas en su respuesta. Mi solución actual es usar dos firmas.
También es posible declarar un parámetro 'out SafeHandle'. –
No funciona aquí, obtengo una 'ArgumentNullException' de' System.StubHelpers.StubHelpers.SafeHandleAddRef (SafeHandle pHandle, Boolean & success) '. – ordag
Sí, @ shf301, esto no funciona en las llamadas P/Invoke. ¿Lo intentaste? – jnm2