Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.025 c
2-1130316667
syte_ser78
2005-10-26 12:51
2005.11.13
выборка записей


14-1130122794
-[ HAWK ]-
2005-10-24 06:59
2005.11.13
Исходник теста


14-1129813837
Sandman29
2005-10-20 17:10
2005.11.13
Опрос - цвет фона и размер шрифта


5-1109742825
Аюс
2005-03-02 08:53
2005.11.13
FreeNotification(Self) принцип работы ?


14-1129697671
boalse
2005-10-19 08:54
2005.11.13
Час суда и т.п.