|
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 |


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