Текущий архив: 2005.11.13;
Скачать: CL | DM;
Вниз
Обращение к портам LPT через WinAPI Найти похожие ветки
← →
Ксардас © (2005-09-09 05:36) [0]Вот кусок кода:
procedure PortWrite(PortAddr:
word; Databyte: byte);
{$IFDEF WIN32}
assembler; stdcall;
asm
mov al,Databyte
mov dx,PortAddr
out dx,al
end;
{$ELSE}
begin
Port[PortAddr] := DataByte;
end;
{$ENDIF}
Собственно я знаю,что в ВинХР напрямую обращаться к портам нельзя.
Посему прошу подсказать кратчайший путь решения проблемы,указанной в заголовке. Тоесть,ечли с этим всё просто,то подскажите функцию,ну а ежели нет,то хотяб с чего начать.
← →
Джо © (2005-09-09 05:55) [1]Напрямую нельзя. Можно "опосредствовано" функциями CreateFile,WriteFile,CloseHandle. Собственно, смотри документацию по ним.
← →
tesseract © (2005-09-10 11:28) [2]
> Напрямую нельзя. Можно "опосредствовано" функциями CreateFile,WriteFile,CloseHandle.
> Собственно, смотри документацию по ним.
Можно но не нужно через что-то вроде SetIorivileges (точно название не помню извини)
Но можно в 2k/xp обращаться к драйверу (40-кратный прирост скорости!).
Но то же - не знаешь не лапай.
через WinApi:
function TEZPL.InitPort(Port:string):boolean;
var fport:pchar;
begin
// Не верим, что получится
Result:=false;_LastError:=ErrInterfaceError;
// если ком порт
fport:=PCHAR(port);
hCom:=CreateFile(fPort,GENERIC_READ OR GENERIC_WRITE,0,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
// Если неверен выходим
if hCom=INVALID_HANDLE_VALUE then exit;
FillChar(ReadOl,SizeOF(ReadOL),0);
ReadOl.hevent:=CreateEvent(nil,true,true,nil);
//end;
Result:=true;
_LastError:=ScOK;
end;
function tezpl._SendCommand(var cmd;length:cardinal):integer;
var
tmp,nb:cardinal;
succ:boolean;
begin
result:=-1;
_LastError:=ErrInterfaceError;
// Пишем команду
result:=_lastError;
succ:=true;
succ:=WriteFile(hCom,cmd^,length,nb,@readol);
if not succ then
begin
tmp:=GetLastError;
if tmp=ERROR_IO_PENDING then
if WaitForSingleObject(ReadOl.hEvent,1000)=WAIT_OBJECT_0 then
begin
if GetOverlappedResult(hCom, ReadOL, nb,false) then Succ:=true
end
end; // if not succ
// Обработка ошибок
if not succ then begin _LastError:=ErrCommandError; result:=_lastError; exit; end;
// Всё успешно
_LastError:=ScOK; Result:=0;
end;
procedure tezpl.ClosePort;
begin
//Пытаемся закрыться
if hCOM<>0 then
try
CloseHandle(hCom);
CloseHandle(ReadOl.hEvent);
hCOM:=0;
except
hCOm:=0;
end;
← →
Ксардас © (2005-09-10 12:02) [3]
>
> Можно но не нужно через что-то вроде SetIorivileges (точно
> название не помню извини)
А где точно инфу насчёт сабжа найти не подскажите?
← →
CHES © (2005-09-12 08:54) [4]http://morgeyz.narod.ru/comlpt.htm
примеры на Ц, но разобраться вполне можно.
Лучше статьи на русском имхо нету.
← →
Ксардас © (2005-09-12 16:54) [5]
> CHES © (12.09.05 08:54) [4]
> http://morgeyz.narod.ru/comlpt.htm
> примеры на Ц, но разобраться вполне можно.
> Лучше статьи на русском имхо нету.
Там ошибка на странице почти в самом конце.Это из-за чего?
← →
Reindeer Moss Eater © (2005-09-12 17:36) [6]Обращение к портам LPT через WinAPI [D7, WinXP]
Через WinApi - это CreateFile ReadFile и так далее.
Страницы: 1 вся ветка
Текущий архив: 2005.11.13;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.028 c