una try sharp que programacion lanzar excepción excepciones excepcion errores ejemplos como catch capturar c# c windows-mobile gps pinvoke

sharp - try catch c# messagebox



¿Por qué DeviceIoControl lanza el error 21(Dispositivo no preparado) desde C#cuando el equivalente en C funciona bien? (0)

Estoy intentando enviar un comando IOCTL_SERVICE_REFRESH al servicio del controlador intermedio de GPS usando C # como este:

handle = CreateFile("GPD0:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); if (handle.ToInt32() == INVALID_HANDLE_VALUE) { rc = Marshal.GetLastWin32Error(); return rc; } int numBytesReturned = 0; rc = DeviceIoControl( handle, IOCTL_SERVICE_REFRESH, null, 0, null, 0, ref numBytesReturned, IntPtr.Zero); int error = Marshal.GetLastWin32Error();

GetLastWin32Error siempre me da el error 21 (el dispositivo no está listo). Sin embargo, la llamada equivalente cuando se hace desde C ++ funciona bien:

HANDLE hGPS = CreateFile(L"GPD0:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hGPS != INVALID_HANDLE_VALUE) { BOOL ret = DeviceIoControl(hGPS,IOCTL_SERVICE_REFRESH,0,0,0,0,0,0); DWORD err = GetLastError(); }

Sospeché que había un problema con las firmas de PInvoke, pero parece que no puedo encontrar nada mal aquí:

[DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)] public static extern int DeviceIoControl( IntPtr hDevice, uint dwIoControlCode, byte[] lpInBuffer, int nInBufferSize, byte[] lpOutBuffer, int nOutBufferSize, ref int lpBytesReturned, IntPtr lpOverlapped); [DllImport("coredll.dll", SetLastError = true)] public static extern IntPtr CreateFile( String lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr attr, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

¿Que me estoy perdiendo aqui?