Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   ASM y Microcontroladores (https://www.clubdelphi.com/foros/forumdisplay.php?f=44)
-   -   Técnica Básica de acceso a puertos en XP (https://www.clubdelphi.com/foros/showthread.php?t=55614)

MaMu 22-04-2008 08:39:33

Técnica Básica de acceso a puertos en XP
 
-----------------------------------------------------------------
Nota:
Esta mini guía está orientada al uso del Puerto Paralelo desde Delphi
-----------------------------------------------------------------


La problemática surge, con la llegada de sistemas operativos basados en Windows NT donde la premisa fundamental es una cuestión de Seguridad.
Sabemos que un programa (y no escapan a éstos los que realizamos con Delphi) en sistemas operativos como XP, se ejecutan en modo Kernel o en modo Usuario, siendo este último el que nos compete. En el modo Kernel, es posible lograr un control sobre los periféricos mediante el diálogo entre la aplicación y su controlador (driver), ya que dicho modo, supone un acceso directo a recursos del sistema. Pero en el modo Usuario, por una cuestión muy simple, la seguridad, esto no nos es posible, por lo que dependeremos para acceder a un periférico de un controlador que corra sobre el modo Kernel, ya que en modo Usuario, tenemos si al menos acceso a los drivers.
Nos bastará con emplear un driver que este corriendo en nuestro Kernel.
Anterior a la aparición de los sistemas basados en NT, podíamos (y aún podemos si los tenemos instalados o lo seguimos usando) acceder a los puertos directamente, ya que no eran instrucciones de privilegio del modo Kernel. Las rutinas clásicas que empleabamos eran las siguientes:

Código Delphi [-]
procedure EscribePuerto(direccion:word;valor:byte);
begin
  asm
   mov dx,direccion
   mov AL,valor
   out DX,AL
  end;
end;

function LeePuerto(direccion:word):byte;
begin
  asm
   mov dx,direccion
   in al,dx
   mov Result,al
  end;
end;

En XP, podemos utilizar un driver, por ejemplo, podemos descargar http://www.logix4u.net/inpout32.htm (incluye un OCX y no ahorramosde distribuir la dll). Y hacer uso de dos funciones de esta librería estaticamente en nuestro programa:

Código Delphi [-]
implementation 
function Inp32(wAddr:word):byte; stdcall; external 'inpout32.dll';
function Out32(wAddr:word;bOut:byte):byte; stdcall; external 'inpout32.dll';

Obviamente, para evitar excepciones, queda a criterio de cada uno de queforma cargar la librería en nuestra aplicación. Luego bien, su uso es muy básico y sensillo:

Código Delphi [-]
....
byteLeido:byte;
begin
 //Enviar 8 al puerto $300
 Out32($300,8) //Puerto=$300 - byte=8
 //Leer el puerto $300
 byteLeido:=Inp32($300); //Puerto=$300 - byte=8end;
end;
....

La alternativa que opté yo en su momento, es importar el OCX desdeDelphi que se incluye en la descarga, THWinterface, ya que meolvido de tener que distribuir la dll en otro archivo. Espero que les ayude esta mini guía, y se animen a retocar ymodificar esos programas que les han dejado de funcionar en XPdebido a las Funciones de Privilegio.

Saludos

mario2000 23-04-2008 21:52:25

;) Muy agradecido por la informacion.


La franja horaria es GMT +2. Ahora son las 17:45:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi