Типа так, плюс две динамические "балалайки", vicx95.dll, vicx.dll и системный vicx.sys. Если надо могу воткнуть/
Код:
unit hiPortIO;
interface
uses Kol,Share,Debug,Windows;
type
THIPortIO = class(TDebug)
private
FID:Cardinal;
FErr:boolean;
FWin98:boolean;
procedure Open;
public
_prop_Port:integer;
_data_Port:THI_Event;
_data_Byte:THI_Event;
_event_onRead:THI_Event;
constructor Create;
procedure _work_doRead(var _Data:TData; Index:word);
procedure _work_doWrite(var _Data:TData; Index:word);
end;
implementation
uses hiLPT;
var
OpenPrt:TOpenPrt;
R_P:TR_P;
W_P:TW_P;
ClosePrt:TClosePrt;
constructor THIPortIO.Create;
begin
inherited;
if not Assigned( R_P ) then
Open;
end;
procedure THIPortIO.Open;
begin
If (GetVersion() and $80000000) <> 0 then
begin
FErr := not FileExists('vicx95.dll') and not FileExists(GetSystemDir + 'vicx95.dll');;
if FErr then
MessageBox(0,'Не найдена библиотека для работы с портами! См. справку.','Ошибка',MB_OK)
else FID := LoadLibrary('vicx95.dll');
FWin98 := true;
end
else
begin
FWin98 := false;
FErr := not FileExists('vicx.dll') and not FileExists(GetSystemDir + 'vicx.dll');
if FErr then
MessageBox(0,'Не найдена библиотека vicx.dll для работы с портами! См. справку.','Ошибка',MB_OK)
else
begin
FID := LoadLibrary('vicx.dll');
OpenPrt := TOpenPrt(GetProcAddress(FID,'OpenPrt'));
ClosePrt := TClosePrt(GetProcAddress(FID,'ClosePrt'));
end;
end;
if FErr then exit;
R_P := TR_P(GetProcAddress(FID,'R_P'));
W_P := TW_P(GetProcAddress(FID,'W_P'));
end;
procedure THIPortIO._work_doRead;
var
FPrt:word;
b:byte;
begin
FPrt := ReadInteger(_data,_data_Port,_prop_Port);
// FPrt := $278;
if not FErr then
if FWin98 then
b := R_P(FPrt,1)
else
begin
FPrt := OpenPrt(FPrt,1,1);
b := R_P(FPrt,0);
ClosePrt(FPrt);
end;
_hi_CreateEvent(_Data,@_event_onRead,b);
end;
procedure THIPortIO._work_doWrite;
var
FState:byte;
FPrt:word;
begin
FState := ReadInteger(_data,_data_Byte,0);
FPrt := ReadInteger(_data,_data_Port,_prop_Port);
if not FErr then
if FWin98 then
W_P(FPrt,1,FState)
else
begin
FPrt := OpenPrt(FPrt,1,1);
W_P(FPrt,FState,0);
ClosePrt(FPrt);
end;
end;
end.