Quantcast
Channel: Delphi Forum - Delphi Programming Kings of Code - Existing Project Development
Viewing all articles
Browse latest Browse all 182

Using the LPT port in the 64 bit application

$
0
0
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. 

İmage



Code:
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.


 

Viewing all articles
Browse latest Browse all 182

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>