Informações sobre o curso.
Windows NT/2000 e XP
Acessando a Porta Paralela
Por: Antônio Rogério Messias
Página 1 de 1     Home  Índice  
ACESSANDO A PORTA PARALELA NAS VERSÕES DO WINDOWS NT/2000 E XP
Para uso particular ou educacional.
Copyright(c) 1999-2008 ROGERCOM.COM
Todos os direitos reservados.


       Por questões de segurança as versões do windows NT/2000 e XP não permitem o acesso direto ao hardware, é necessário um driver que "converse" com o núcleo (kernel) desse sistema para ter acesso às portas físicas do computador.
       Nas versões do windows 95/Me e 98 não há restrição e o acesso pode ser direto, portanto, não há necessidade do uso de drives.
       A maneira mais fácil de resolver este problema é através da DLL Inpout32.dll disponível para download na URL http://www.logix4u.net/inpout32.htm.
       Dentro dessa DLL já estão inclusas as rotinas: in e out para acesso as portas, e também o driver que faz a comunicação com o núcleo do sistema operacional. Está tudo em um único arquivo de 32KB.
       Quando criar um programa executável baseado na DLL Inpout32 para acessar a Porta Paralela no windows NT/2000 ou XP, é importante que essa DLL esteja na mesma pasta do programa executável.
       Veja abaixo algumas mensagens de erro irritantes, exibidas quando tentamos executar um programa que não tem auxílio de um driver para rodar nas versões do windows NT/2000 e XP:


Figura 1 - Erro de execução


Exemplos em DevC++ e Borland C++

 

Fonte 1 - Teste.c, exemplo para utilização em DevC++ e Borland C++
#include <stdio.h>   //printf() entre outras.
#include <conio.h>  
//getch().
#include <windows.h>  
//Necessário para: LoadLibrary(), GetProcAddress() e HINSTANCE.

//Declaração dos ponteiros para função.
typedef short _stdcall (*PtrInp)(short EndPorta);
typedef void _stdcall (*PtrOut)(short EndPorta, short valor);

int main(void)
{
   HINSTANCE hLib;
//Instância para a DLL inpout32.dll.

   PtrInp inportb;     
//Instância para a função Imp32().
   PtrOut outportb;  
//Instância para a função Out32().

   //Carrega a DLL na memória.
   hLib = LoadLibrary("inpout32.dll");

   if(hLib == NULL) //Verifica se houve erro.
   {
      printf("Erro. O arquivo inpout32.dll não foi encontrado.\n");
      getch();
      return -1;
   }

   //Obtém o endereço da função Inp32 contida na DLL.
   inportb = (PtrInp
) GetProcAddress(hLib, "Inp32");

   if(inportb == NULL) //Verifica se houve erro.
   {
      printf("Erro. A função Inp32 não foi encontrada.\n");
      getch();
      return -1;
   }

   //Obtém o endereço da função Out32 contida na DLL.
   outportb = (PtrOut
) GetProcAddress(hLib, "Out32");

   if(outportb == NULL) //Verifica se houve erro.
   {
       printf("Erro. A função Out32 não foi encontrada.\n");
       getch();
       return -1;
   }

   //-------------------------------------------------------------------------------------------------------------------------  
   //Uso das funções outportb() e inportb():

   printf("Pressione uma tecla para ligar o pino D0.\n");
   getch();
   outportb(0x378,1);
//Ativa o pino D0 do Registro de Dados da porta paralela.
   printf("Pressione uma tecla para desligar o pino D0.\n");
   getch();
   outportb(0x378,0);
//Desativa os pino do Registro de Dados da porta paralela.

   FreeLibrary(hLib);
//Libera memória alocada pela DLL.
   return(0);
}

                        Para compilar via linha de comando no Borland C++:
                        BCC32  -
IC:\BORLAND\BCC55\INCLUDE   TESTE.C



Exemplo em C++Builder

Fonte 2 - Teste.c, exemplo para utilização no C++Builder

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//Declaração dos ponteiros para função.
typedef short _stdcall (*PtrInp)(short
EndPorta);
typedef void _stdcall (*PtrOut)(short
EndPorta, short datum);

HINSTANCE hLib; //Instância para a DLL inpout32.dll.
PtrInp inportb;
    //Instância para a função Imp32().
PtrOut outportb;
 //Instância para a função Out32().
//---------------------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   
//Carrega a DLL na memória.
   hLib = LoadLibrary("inpout32.dll");

   if(hLib == NULL)
   {
      ShowMessage("Erro. O arquivo inpout32.DLL não foi encontrado.");
      Application->Terminate();
   }

   
//Obtém o endereço da função Inp32 contida na DLL.
   inportb = (PtrInp) GetProcAddress(hLib, "Inp32");
   if(inportb == NULL)
   {
      ShowMessage("Erro. Erro ao endereçar a função Inp32.");
      Application->Terminate();
   }

   
//Obtém o endereço da função Out32 contida na DLL.
   outportb = (PtrOut) GetProcAddress(hLib, "Out32");
   if(outportb == NULL)
   {
      ShowMessage("Erro. Erro ao endereçar a função Out32.");
      Application->Terminate();
   }
}


//---------------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   outportb(0x378,1);
//Ativa o pino D0 do Registro de Dados da porta paralela.
}
//---------------------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   outportb(0x378,0);
//Desativa os pino do Registro de Dados da porta paralela.
}
//---------------------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
   FreeLibrary(hLib);
//Libera memória alocada pela DLL.
}


Exemplo em DELPHI

Fonte 3 - Teste.pas, exemplo para utilização em DELPHI

unit ChamaDLL;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Spin, ExtCtrls;

type
   TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   Label2: TLabel;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

{Definição das funções da DLL.}
function inportb(EndPorta: Integer): BYTE stdcall; external 'inpout32.DLL' name 'Inp32';
procedure outportb(EndPorta: Integer; Valor:BYTE); stdcall; external 'inpout32.DLL' name 'Out32';

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Label2.Caption := IntToStr( inportb($379) );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    outportb($378,255);
//Liga todos os pinos do Registro de Dados.
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    outportb($378,0);
//Desliga todos os pinos do Registro de Dados.
end;

end.


Exemplo em Visual Basic

Fonte 4 - Teste.vbp, exemplo para utilização no Visual Basic

Option Explicit
'Declaração das funções da DLL
Private Declare Sub Out32 Lib "inpout32.dll" (ByVal PortAddress As Integer, ByVal PortData As Byte)
Private Declare Function Inp32 Lib "inpout32.dll" (ByVal PortAddress As Integer) As Byte

Private Sub Command1_Click()
    Out32 &H378, 255
'Liga todos os pinos do Registro de Dados.
End Sub

Private Sub Command2_Click()
    Out32 &H378, 0
'Desliga todos os pinos do Registro de Dados.
End Sub

Private Sub Timer1_Timer() 'Loop
    Label2.Caption = Inp32(&H379)
'Lê um byte do Registro de Status.
End Sub

 


Volta à página principal. 
 

Índice dos artigos.
http://www.rogercom.com
© Copyright, 1999-2008 ROGERCOM - Antonio Rogério Messias - rogercom@rogercom.com
Todos os Direitos Reservados - All Rights Reserved.