PDA

Ver la Versión Completa : Evitar errores en BlockInput


Ramsay
13-02-2016, 16:06:29
Hola ,estoy haciendo una funcion para bloquear el teclado , en algunos ejemplos se usa una funcion para verificar que blockinput existe en el user32.dll , queria saber si uso try y except puedo evitar que se muestren errores en caso de que la funcion no existe.


function BlockInput(fBlockInput: Boolean): DWORD; stdcall; external 'user32.DLL';

procedure TForm1.btnTestClick(Sender: TObject);
begin
try
begin
BlockInput(True);
end
except
begin
//
end;
end;


¿ Si esta funcion no existe mostraria un error de todas formas al sistema ?

AgustinOrtu
13-02-2016, 17:22:07
No, ya que estas "comiendo" u ocultando la excepcion dentro del bloque except; en ingles esto se conoce como "trap exceptions"

De todas formas, tene cuidado porque ahi estas comiendo todas las excepciones; lo mas indicado en tu caso seria evaluar el tipo de excepcion que se genera y solamente ocultar la de la falta del user32.dll

roman
15-02-2016, 18:55:56
¿ Si esta funcion no existe mostraria un error de todas formas al sistema ?

No mostraría nada, pero no por el bloque try-except sino porque tu aplicación ni siquiera se ejecutaría. La manera en que importas la función (static loading) requiere que la función exista al momento de iniciar la aplicación y, de no ser así, el S.O aborta la carga de la aplicación con un mensaje de error que no puedes interceptar.

Para poder verificar la existencia de la función en tiempo de ejecución debes usar una carga dinámica de la función, usando LoadLibrary y GetProcAddress, de la API de Windows.

También, según leo (http://docwiki.embarcadero.com/RADStudio/Seattle/en/Libraries_and_Packages), en las versiones recientes de Delphi existe la directiva delayed, que agregarías a la declaración de la función:


function BlockInput(fBlockInput: Boolean): DWORD; stdcall; external 'user32.DLL' delayed;


con lo cual podrías verificar la existencia de la función antes de usarla por primera vez.

// Saludos