Using the LPT port in the 64 bit application.
An example of the use of dynamic libraries inpout32.dll in 64 bit and 32 bit application. Tested on Windows XP SP3 Pro 32bit, Windows 7 Pro 64bit and 32bit, Windows Server 2008 R2, Windows 8 Enterprise 64bit, Windows Server 2012.
{*------------------------------------------------------------------------
* Aleksandr Nazaruk
* http://freehand.com.ua
*------------------------------------------------------------------------*}
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.UITypes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, IniFiles,
Vcl.Imaging.pngimage, Vcl.ExtCtrls, Vcl.ComCtrls;
{$ifdef Win64}
const
iodll = 'inpoutx64.dll';
{$Else}
const
iodll = 'inpout32.dll';
{$EndIf}
type
Bit = 0..1;
type
TBitSet = array[0..7] of Bit;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Label1: TLabel;
Label2: TLabel;
GroupBox3: TGroupBox;
GroupBox4: TGroupBox;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
GroupBox5: TGroupBox;
StatusBar1: TStatusBar;
Edit1: TEdit;
Button9: TButton;
Label3: TLabel;
Label4: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button11: TButton;
t_LPTMon: TTimer;
ComboBox1: TComboBox;
Label5: TLabel;
Edit5: TEdit;
Edit6: TEdit;
Label6: TLabel;
Label7: TLabel;
N4: TMenuItem;
Button10: TButton;
Button12: TButton;
Button13: TButton;
Button14: TButton;
Button15: TButton;
Label8: TLabel;
GroupBox2: TGroupBox;
Label9: TLabel;
Button17: TButton;
Button18: TButton;
Button19: TButton;
Button20: TButton;
Label10: TLabel;
GroupBox6: TGroupBox;
Label11: TLabel;
Label12: TLabel;
Edit7: TEdit;
Button16: TButton;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Button21: TButton;
Edit11: TEdit;
Label13: TLabel;
procedure Button8Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit4Change(Sender: TObject);
Function isInpout32Load: boolean;
procedure t_LPTMonTimer(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
Function IOINIPortToDec(port : string):word;
procedure Button11Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit4Enter(Sender: TObject);
procedure Edit4Exit(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure Edit7Change(Sender: TObject);
procedure Button17Click(Sender: TObject);
procedure Button19Click(Sender: TObject);
procedure Edit10Change(Sender: TObject);
procedure Edit8Change(Sender: TObject);
procedure Button21Click(Sender: TObject);
procedure Button16Click(Sender: TObject);
procedure Edit11Change(Sender: TObject);
private
{ Private declarations }
public
InpOut32Handle : THandle;
Inp32 : function(PortAdr: word): byte; stdcall;
Out32 : function(PortAdr: word; Data: byte): byte; stdcall;
IsInpOutDriverOpen : function() : boolean; stdcall;
IsXP64Bit : function() : boolean; stdcall;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetNBit (X, N: byte): Bit;
begin
Result := x shr N and 1;
end;
function GetBits (X: byte): TBitSet;
var
N: integer;
begin
for N := 0 to 7 do
Result[N] := GetNBit(X, N);
end;
function MakeByte (BitSet: TBitSet): byte;
var
i: integer;
begin
Result := 0;
for i := 7 downto 0 do
Result := Result shl 1 + (BitSet[i] and 1);
end;
Function TForm1.isInpout32Load: boolean;
begin
result:=false;
try
if inpout32Handle <> 0 then
begin
result:=IsInpOutDriverOpen;
end;
except
result:=false
end;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
close;
end;
procedure TForm1.t_LPTMonTimer(Sender: TObject);
var
port : integer;
begin
if assigned(Inp32) then
begin
// Data
port:=strtoint(edit6.Text);
edit1.Text:=inttostr(Inp32(port));
// Status
inc(port,1);
edit11.Text:=inttostr(Inp32(port));
// Control
inc(port,1);
edit7.Text:=inttostr(Inp32(port));
end;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
if assigned(Out32) then
begin
try
Out32(strtoint(edit6.Text), strtoint(edit4.Text));
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
end;
end;
procedure TForm1.Button16Click(Sender: TObject);
var
port : integer;
begin
if assigned(Out32) then
begin
try
port:=strtoint(edit6.Text);
inc(port, 2);
Out32(port, strtoint(edit8.Text));
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
end;
end;
procedure TForm1.Button17Click(Sender: TObject);
var
BitSet : TBitSet;
b : Bit;
b1: byte;
port : integer;
begin
try
if (Sender as TButton).Caption='1' then b:=1 else b:=0;
b1 := strtoint(edit7.Text)
finally
BitSet:=GetBits(b1);
BitSet[(Sender as TButton).Tag]:=b;
if assigned(Out32) then
begin
try
port:=strtoint(edit6.Text);
inc(port,2);
Out32(port, Makebyte(BitSet));
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
end;
end;
end;
procedure TForm1.Button19Click(Sender: TObject);
var
BitSet : TBitSet;
b : Bit;
b1: byte;
port : integer;
begin
try
if (Sender as TButton).Caption='1' then b:=0 else b:=1;
b1 := strtoint(edit7.Text)
finally
BitSet:=GetBits(b1);
BitSet[(Sender as TButton).Tag]:=b;
if assigned(Out32) then
begin
try
port:=strtoint(edit6.Text);
inc(port,2);
Out32(port, Makebyte(BitSet));
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
end;
end;
end;
procedure TForm1.Button21Click(Sender: TObject);
var
port : integer;
begin
if assigned(Out32) then
begin
try
port:=strtoint(edit6.Text);
inc(port, 2);
Out32(port, strtoint(edit10.Text));
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
end;
end;
procedure TForm1.Button8Click(Sender: TObject);
var
BitSet : TBitSet;
b : Bit;
b1: byte;
begin
try
if (Sender as TButton).Caption='1' then b:=0 else b:=1;
b1 := strtoint(edit1.Text)
finally
BitSet:=GetBits(b1);
BitSet[(Sender as TButton).Tag]:=b;
if assigned(Out32) then
begin
try
Out32(strtoint(edit6.Text), Makebyte(BitSet));
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
end;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
if assigned(Out32) then
begin
try
Out32(strtoint(edit6.Text), strtoint(edit2.Text));
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
end;
end;
Function TForm1.IOINIPortToDec(port : string):word;
const section = 'LPT';
var
IniFile : TIniFile;
fileConfig : string;
begin
result:=0;
try
fillchar(result,sizeof(result),#0);
fileConfig := ExtractFilePath(ParamStr(0))+'io.ini';
IniFile := TIniFile.Create(fileconfig);
try
try
result:=IniFile.ReadInteger(section,port,0);
except
result:=0;
end;
finally
IniFile.Free;
end;
except
;
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
try
edit6.Text:=inttostr(IOINIPortToDec(combobox1.Items.Strings[combobox1.ItemIndex]));
edit5.Text:='$'+IntToHex(strtoint(edit6.Text),2);
except
edit6.Text:='0';
edit5.Text:='$00';
end;
end;
procedure TForm1.Edit10Change(Sender: TObject);
begin
if edit8.Tag=1 then exit;
try
edit8.Text:='$'+IntToHex(strtoint(edit10.Text),2);
except
;
end;
end;
procedure TForm1.Edit11Change(Sender: TObject);
var
b : byte;
BitSet : TBitSet;
begin
try
b := strtoint(edit11.Text);
finally
BitSet:=GetBits(b);
button10.Caption:=inttostr(abs(BitSet[3]));
button12.Caption:=inttostr(abs(BitSet[4]));
button13.Caption:=inttostr(BitSet[5]);
button14.Caption:=inttostr(abs(BitSet[6]));
button15.Caption:=inttostr(abs(BitSet[7]-1));
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
b : byte;
BitSet : TBitSet;
begin
try
b := strtoint(edit1.Text);
finally
edit3.Text:='$'+IntToHex(b,2);
BitSet:=GetBits(b);
button8.Caption:=inttostr(BitSet[0]);
button7.Caption:=inttostr(BitSet[1]);
button6.Caption:=inttostr(BitSet[2]);
button5.Caption:=inttostr(BitSet[3]);
button4.Caption:=inttostr(BitSet[4]);
button3.Caption:=inttostr(BitSet[5]);
button2.Caption:=inttostr(BitSet[6]);
button1.Caption:=inttostr(BitSet[7]);
end;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
if edit4.Tag=1 then exit;
try
edit4.Text:=inttostr(strtoint(edit2.Text));
except
edit4.Text:='';
end;
end;
procedure TForm1.Edit4Change(Sender: TObject);
begin
if edit2.Tag=1 then exit;
try
edit2.Text:='$'+IntToHex(strtoint(edit4.Text),2);
except
;
end;
end;
procedure TForm1.Edit4Enter(Sender: TObject);
begin
(Sender as TEdit).Tag:=1;
end;
procedure TForm1.Edit4Exit(Sender: TObject);
begin
(Sender as TEdit).Tag:=0;
end;
procedure TForm1.Edit7Change(Sender: TObject);
var
b : byte;
BitSet : TBitSet;
begin
try
b := strtoint(edit7.Text);
finally
edit9.Text:='$'+IntToHex(b,2);
BitSet:=GetBits(b);
button17.Caption:=inttostr(abs(BitSet[0]-1));
button18.Caption:=inttostr(abs(BitSet[1]-1));
button19.Caption:=inttostr(BitSet[2]);
button20.Caption:=inttostr(abs(BitSet[3]-1));
end;
end;
procedure TForm1.Edit8Change(Sender: TObject);
begin
if edit10.Tag=1 then exit;
try
edit10.Text:=inttostr(strtoint(edit8.Text));
except
edit10.Text:='';
end;
end;
Procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
LPTHandl: THandle;
b:byte;
b1 : PByte;
begin
button1.Tag:=7;
button2.Tag:=6;
button3.Tag:=5;
button4.Tag:=4;
button5.Tag:=3;
button6.Tag:=2;
button7.Tag:=1;
button8.Tag:=0;
button20.Tag:=3;
button19.Tag:=2;
button18.Tag:=1;
button17.Tag:=0;
t_LPTMon.Enabled:=false;
button1.Enabled:=false;
button2.Enabled:=false;
button3.Enabled:=false;
button4.Enabled:=false;
button5.Enabled:=false;
button6.Enabled:=false;
button7.Enabled:=false;
button8.Enabled:=false;
button9.Enabled:=false;
button11.Enabled:=false;
button17.Enabled:=false;
button18.Enabled:=false;
button19.Enabled:=false;
button20.Enabled:=false;
button21.Enabled:=false;
button16.Enabled:=false;
edit2.Enabled:=false;
edit4.Enabled:=false;
edit8.Enabled:=false;
edit10.Enabled:=false;
combobox1.Enabled:=false;
try
inpout32Handle := loadLibrary(PWChar(WideString(iodll)));
if inpout32Handle <> 0 then
begin
@Inp32 :=nil;
@Out32 :=nil;
@IsInpOutDriverOpen :=nil;
@IsXP64Bit :=nil;
@IsInpOutDriverOpen := getProcAddress(inpout32Handle, 'IsInpOutDriverOpen');
@Out32 := getProcAddress(inpout32Handle, 'Out32');
@Inp32 := getProcAddress(inpout32Handle, 'Inp32');
@IsXP64Bit := getProcAddress(inpout32Handle, 'IsXP64Bit');
if not assigned(Inp32) then
begin
MessageDlg(Format('getProcAddress(%d, Inp32) failed',[inpout32Handle]),mtError, mbOKCancel, 0);
end;
if not assigned(IsXP64Bit) then
begin
MessageDlg(Format('getProcAddress(%d, IsXP64Bit) failed',[inpout32Handle]),mtError, mbOKCancel, 0);
end;
if not assigned(Out32)then
begin
MessageDlg(Format('getProcAddress(%d, Out32) failed',[inpout32Handle]),mtError, mbOKCancel, 0);
end;
if not assigned(IsInpOutDriverOpen) then
begin
MessageDlg(Format('getProcAddress(%d, IsInpOutDriverOpen) failed',[inpout32Handle]),mtError, mbOKCancel, 0);
end;
end else
begin
MessageDlg(Format('loadLibrary(%s) failed',[iodll]),mtError, mbOKCancel, 0);
end;
except
on E : Exception do
begin
MessageDlg(Format('Internal error %s',[E.Message]),mtError, mbOKCancel, 0);
end;
end;
{$ifdef Win64}
form1.Caption:='NT6.x LPT 64bit Demo Code FreeHand.com.ua 2013';
{$Else}
form1.Caption:='NT6.x LPT 32bit Demo Code FreeHand.com.ua 2013';
{$EndIf}
combobox1.Items.Clear;
for i := 0 to 10 do
begin
LPTHandl := CreateFile(PWChar(WideString('LPT' + inttostr(i + 1))),
GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
try
if LPTHandl <> INVALID_HANDLE_VALUE then
begin
combobox1.Items.Add('LPT' + inttostr(i + 1));
combobox1.ItemIndex:=0;
button1.Enabled:=true;
button2.Enabled:=true;
button3.Enabled:=true;
button4.Enabled:=true;
button5.Enabled:=true;
button6.Enabled:=true;
button7.Enabled:=true;
button8.Enabled:=true;
button9.Enabled:=true;
button11.Enabled:=true;
button17.Enabled:=true;
button18.Enabled:=true;
button19.Enabled:=true;
button20.Enabled:=true;
button16.Enabled:=true;
button21.Enabled:=true;
combobox1.Enabled:=true;
edit2.Enabled:=true;
edit4.Enabled:=true;
edit8.Enabled:=true;
edit10.Enabled:=true;
t_LPTMon.Enabled:=true;
end;
finally
CloseHandle(LPTHandl);
end;
end;
ComboBox1Change(self);
end;
end.
Stand:
- Windows 8 Enterprise 64Bit Eng
- Delphi XE3
Links:

Немає коментарів:
Дописати коментар