GORAGOD.com

Unit IO32

unit IO32

การใช้งานพอร์ตขนาน บนวินโดวส์ 98 ME และ XP

การใช้งาน
แตกไฟล์ rar ออก ข้างในจะพบไฟล์ IO32.pas, inpout32.dll และ hwinterface.sys
ทำการ Install คอมโพเน้นท์ และกำหนด Search Path ให้ถูกต้อง แล้วทำการสั่ง Compile เป็นอันเสร็จสิ้นกระบวนการติดตั้ง Component
ถ้า คุณใช้ Windows 98 หรือ ME คุณจะสามารถใช้งาน Source Code ได้เลยแต่ถ้าคุณใช้ Windows XP (ไม่เคยทดสอบบน NT) คุณจะต้องทำขั้นตอนต่อไป
ทำการ copy inpout32.dll ไปที่ \windows\system32
พิมพ์ regsvr32 inpout32.dll ลงในหน้าต่าง Start-->Run เป็นการลงทะเบียนไฟล์
ไม่ต้องสนใจ Error ที่แจ้งออกมา และทำการ Restart เครื่องใหม่เป็นอันเสร็จสิ้นกระบวนการติดตั้ง
เราสามารถลบไฟล์ inpout32.dll ทิ้งได้ เพราะไม่มีความจำเป็นต้องใช้ในโปรแกรมของเรา

การทำงาน

ในการทำงานปกติบน Windows 98 หรือ ME เราสามารถ ใช้งานพอร์ตขนานได้โดยผ่าน Assembler คือ
procedure _Out(AddressPort: WORD; Val: Byte);
begin
  asm
    push dx
    mov  dx, AddressPort
    mov  al, Val
    out  dx, al
    pop  dx
  end;
end;

function _In(AddressPort: WORD): Byte;
begin
  asm
    push dx
    mov  dx, AddressPort
    in   al, dx
    mov  Result, al
    pop  dx
  end;
end;


แต่ถ้าเป็นบนวินโดวส์ XP เราจะต้องเรียกใช้ผ่้านบริการ Service ซึ่งก็คือ hwinterface นั่นเอง

//ขั้นตอนหลัก ขั้นตอนแรก เป็นการเปิดไดร์เวอร์  hwinterface
hdriver := CreateFile('\?\hwinterface',
  GENERIC_READ or GENERIC_WRITE,
  0,
  nil,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  0);
//หลังจากนั้นจึงจะเขียน หรือ อ่านค่า พอร์ตขนานได้
procedure TPort.PortOut(AddressPort, Val: SmallInt);
var
  BytesReturned: DWORD;
  Buffer: array[0..3] of Byte;
begin
  if (hdriver = 0) then _Out(AddressPort, Val)
  else begin
    FillChar(Buffer, SizeOf(Buffer), 0);
    CopyMemory(@Buffer, @AddressPort, SizeOf(AddressPort));
    Buffer[2] := LOBYTE(Val);
    DeviceIoControl(hdriver,
      DWORD(IOCTL_WRITE_PORT_UCHAR),
      @Buffer,
      3,
      nil,
      0,
      BytesReturned,
      nil);
  end;
end;

function TPort.PortIn(AddressPort: WORD): SmallInt;
var
  BytesReturned: DWORD;
  Buffer: array[0..3] of Byte;
begin
  if (hdriver = 0) then Result := _In(AddressPort)
  else begin
    FillChar(Buffer, SizeOf(Buffer), 0);
    CopyMemory(@Buffer, @AddressPort, SizeOf(AddressPort));
  DeviceIoControl(hdriver,
      DWORD(IOCTL_READ_PORT_UCHAR),
      @Buffer,
      2,
      @Buffer,
      1,
      BytesReturned,
      nil);
    Result := Buffer[0];
  end;
end;
//และเลิกการใช้งานด้วย
CloseHandle(hdriver);


หมายเหตุ
inpout32.dll เป็น dll ที่พัฒนาขึ้นเพื่อใช้ในการเรียกใช้พอร์ตขนานบน windows XP โดยเฉพาะ ผมจำเวปไซต์ที่เกี่ยวข้องไม่ได้
แต่ผมพัฒนา unit IO32 นี้มาจาก ซอร์สโค้ดของ inpout32.dll ซอร์สโค้ดของ inpout32.dll ซึ่งเขียนขึ้นมาจากภาษา C++ ถ้าต้องการความรู้เพิ่มเติมให้ลอง Search หาดูนะครับ

การนำโปรแกรมที่เขียนขึ้นจาก ซอร์สโค้ดนี้ ไปใช้งาน (EXE) จำเป็นต้องลงทะเบียนไฟล์ทั้งสองก่อนเสมอ ดูตัวอย่างการใช้งานได้ที่โปรแกรม Video Capture และ Telephone Recorder

 (38)