whirlpool washing quiet partner machine español dishwasher c++ c winapi port handle

c++ - washing - ¿Cómo comprobar si una MANIJA es válida o no?



whirlpool quiet partner ii manual español (9)

En C ++, he abierto un puerto serie que tiene una HANDLE . Dado que el puerto puede cerrarse por una aplicación externa, ¿cómo puedo verificar que el HANDLE todavía es válido antes de leer los datos?

Creo que se puede hacer comparando HANDLE con una función API adecuada, pero ¿cuál? Gracias.


Como el puerto puede cerrarse por una aplicación externa.

Esto no es posible, una aplicación externa no puede obtener el valor de identificador adecuado para pasar a CloseHandle (). Una vez que haya abierto el puerto, cualquier otro proceso que intente obtener un identificador del puerto obtendrá AccessDenied.

Dicho esto, existe un crapware que hackea esta restricción al tener un conocimiento secreto de las estructuras del kernel no documentadas que almacenan identificadores para un proceso. Eres impotente contra ellos, no cometas el error de asumir esta batalla haciendo lo mismo. Tú perderás. Si un cliente se queja de esto, entonces dale el consejo de mi médico: "si duele, no lo hagas".


Algunas funciones de WinAPI devuelven un significado ERROR_INVALID_PARAMETER sin sentido si se les pasan identificadores válidos, por lo que existe un caso de uso real para verificar la validez de los manejadores.

La función GetHandleInformation hace el trabajo: http://msdn.microsoft.com/en-us/library/ms724329%28v=vs.85%29.aspx


Comprobar si un identificador es "válido" es un error. Necesitas tener una mejor manera de lidiar con esto.

El problema es que una vez que se ha cerrado un identificador, se puede generar el mismo valor de manejador mediante una nueva apertura de algo diferente, y su prueba podría decir que el identificador es válido, pero no está operando en el archivo que cree que es.

Por ejemplo, considera esta secuencia:

  1. La manija está abierta, el valor real es 0x1234
  2. Se usa el mango y el valor se pasa alrededor.
  3. La manija está cerrada.
  4. Alguna otra parte del programa abre un archivo, obtiene un valor de identificador 0x1234
  5. El valor del identificador original se "verifica para su validez" y se pasa.
  6. Se utiliza el identificador, operando en el archivo incorrecto.

Por lo tanto, si es su proceso, debe hacer un seguimiento de qué identificadores son válidos y cuáles no. Si obtuvo el identificador de algún otro proceso, se habrá colocado en su proceso usando DuplicateHandle (). En ese caso, debe administrar la vida útil del identificador y el proceso de origen no debería hacerlo por usted. Si sus manijas se están cerrando por otro proceso, asumo que usted es el que está haciendo eso, y necesita lidiar con la contabilidad.


Intente usar la función IsWindow() ;-)

IsWindow() es una función de la API de Windows desde Windows 2000.


Konuyla ilgili örnek `

// File handle: CreateFile(), GetHandleInformation() and CloseHandle() #include <windows.h> #include <stdio.h> int main(void) { // handle to a file HANDLE hFile; // file and path, change accordingly. LPCWSTR is a pointer to a constant // null-terminated string of 16-bit Unicode characters. It is a typedef: // typedef CONST WCHAR *LPCWSTR. The modifier ''L'' is for wide character. LPCWSTR fname = L"c://testfile.txt"; DWORD lpdwFlags[100]; BOOL test; // Create a file with the given information... hFile = CreateFile(fname, // file to be opened GENERIC_WRITE, // open for writing FILE_SHARE_WRITE, // share for writing NULL, // default security CREATE_ALWAYS, // create new file only FILE_ATTRIBUTE_NORMAL |FILE_ATTRIBUTE_ARCHIVE | SECURITY_IMPERSONATION, // normal file archive and impersonate client NULL); // no attr. template if(hFile == INVALID_HANDLE_VALUE) printf("Could not open %s file, error %d/n", fname, GetLastError()); else { printf("File''s HANDLE is OK!/n"); test = GetHandleInformation(hFile, lpdwFlags); printf("The return value is %d, error %d/n", test, GetLastError()); } // when finished, close the file handle CloseHandle(hFile); DeleteFile(fname); return 0; }`

por http://www.tenouk.com/cpluscodesnippet/createfilegetclosehandleinfo.html


Para verificar el identificador, primero necesitamos saber para qué sirve nuestro MANGO, (para un Archivo / Puerto / Ventana, ...), luego, busque la función adecuada para comprobarlo (gracias a @janm por su ayuda). Tenga en cuenta que el deber de la función puede ser especialmente para este destino o no. En mi caso, si abrí un puerto serie mediante CreateFile (), puedo verificar el estado de COM mediante la función de API GetCommState () que llena nuestra estructura de información de COM. Si el puerto ya no está abierto o es inaccesible, la función devuelve 0 y si llama a GetLastError () inmediatamente, obtendrá el valor ERROR_INVALID_HANDLE. Gracias a todos por las ayudas.


Probablemente estés bajo Windows y estés usando ReadFile para leer los datos. La única forma de comprobarlo es intentando leer. Si el HANDLE no es válido, devolverá un código de error (use GetLastEror () para ver cuál es) que probablemente sea ERROR_HANDLE_INVALID .


Sé que es un poco tarde, pero tuve una pregunta similar para usted, cómo verificar si una tubería (una tubería que creé con CreateFile) todavía está abierta (tal vez el otro extremo cierre la conexión) y pueda leer, y si No es, abrirlo de nuevo. Hice lo que sugirió @Felix Dombek y usé el WriteFile para verificar la conexión. Si devolvió 1 significa que la tubería está abierta, de lo contrario, la abrí con CreateFile nuevamente. Esto implica que su tubería es dúplex. Aquí está el CreateFile:
hPipe2 = CreateFile(lpszPipename2, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
y aquí es cómo comprobé la conexión:

while(1) { bool MessageSent = WriteFile(hPipe2, "Test", 0, &cbWritten, NULL); if (!(MessageSent)) { LogsOut("Read pipe has been disconnected"); //Call method to start the pipe again break; } Sleep(200); // I need this because it is a thread }

Esto está funcionando bien para mí :)


Si le dan un HANDLE y simplemente quiere saber si es realmente un identificador de archivo abierto, existe la función de la API de Windows GetFileInformationByHandle para eso.

Dependiendo de los permisos que su identificador le otorga para el archivo, también puede intentar mover el puntero del archivo usando SetFilePointer , leer algunos datos de este usando ReadFile , o realizar una operación de escritura nula usando WriteFile con nNumberOfBytesToWrite configurado a 0.