ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...

|
|
|
Visitors - Session views |       
7 ธันวาคม พ.ศ.2549 105 Users On-Line. |
|
Visitors - Page views |        1 กุมภาพันธ์ พ.ศ.2551 |
|
|
|
 |
|
VB6 กับการอ่านค่า MAC Address ของ LAN Card ด้วยวิธีบ้านๆ (ตามเคย) |
Category »
VB 6/VB.Net โดย : Webmaster เมื่อ 28/8/2552 เวลา: 02:34 | (อ่าน : 21083) | ผมเขียนบทความตอนนี้ขึ้นมาแบบลัดคิว (สดๆร้อนๆ) เพราะทีแรกกะส่ง VB.NET ออกมาก่อน ทั้งโค้ด และ คำอธิบายเรียบร้อย ... แต่เจอคำถามจากหลายๆคน ที่ถามผมมาอย่างต่อเนื่องคล้ายๆกัน คือ ตัวแปลภาษาตัวไหนมันดีกว่ากัน ทำไมผมจึงเลือกใช้ VB6 ทั้งๆที่ผมเองก็เขียน VB.Net ได้ ... (ความคิดผม) : ตัวแปลภาษาที่ใช้ มันไม่ใช่เรื่องหลัก แต่เรื่องแนวคิด หรือ จินตนาการที่ล่องลอยอยู่กลางอากาศ ก่อนที่จะปั้นมันขึ้นมาให้สัมผัสได้ แตะต้องได้ หรือที่เราเรียกว่า "โปรแกรม" นี่แหละที่สำคัญกว่า ... ซึ่งในแวดวงทางการศึกษา "ของจริง" คือ สื่อการเรียนการสอนที่ดีที่สุดครับ ... พี่น้อง ... ดังนั้นของแบบนี้มันต้องมีการพิสูจน์ให้เห็น ... ซึ่งหากพี่น้องได้ลองศึกษาดูแล้ว ผมคิดว่าหลายคนน่าจะถูกกระตุ้นต่อมไอเดียจนพุ่งกระฉูด ให้นำไปประยุกต์ใช้งานอย่างอื่นได้สบายเลย ...
แนวคิดของงานชิ้นนี้ ... ไม่ใช้ API, OCX, DLL หรือ ActiveX อาศัยคำสั่งของ DOS ร่วมกับการอ่านข้อมูลจาก Text File เท่านั้นเป็นพอ ... หลักการคิดแก้ปัญหาแบบง่ายๆ แต่สามารถนำไปประยุกต์ได้อย่างกว้างขวางมาก หลายคนอาจจะไม่เคยรู้มาก่อนว่า คำสั่งต่างๆของ DOS หากไม่มีการสั่งให้เปลี่ยนทิศทางการแสดงผล (Redirect) จะถือว่าเป็นการแสดงผลออกทางจอภาพโดยปริยาย แต่ถ้าหากต่อด้วยเครื่องหมาย > ตามด้วยชื่อไฟล์ เช่น
เมื่อเปิดไฟล์ MyIPConfig.txt
Windows IP Configuration
Host Name . . . . . . . . . . . . : Thongkorn
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Unknown
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Realtek RTL8139/810x Family Fast Ethernet NIC
Physical Address. . . . . . . . . : 00-00-00-99-99-99
Dhcp Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
IP Address. . . . . . . . . . . . : 192.168.0.151
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.0.1
DHCP Server . . . . . . . . . . . : 192.168.0.1
DNS Servers . . . . . . . . . . . : 192.168.0.1
Lease Obtained. . . . . . . . . . : Wednesday, August 26, 2009 11:03:55 PM
Lease Expires . . . . . . . . . . : Tuesday, January 19, 2038 10:14:07 AM
|
หรือหากสั่ง ipconfig /all >> MyIPConfig.txt หมายถึง ให้นำข้อมูลที่ได้ใหม่นี้ไปต่อท้ายจากข้อมูลเดิม (ความรู้เกี่ยวกับเรื่องของการทำ Redirect)
หลักการคิดที่จะเขียนโปรแกรม (ไม่จำเป็นเฉพาะแค่ VB6 เท่านั้น)
รันคำสั่งภายนอก หรือ คำสั่ง DOS ผ่านทาง Shell
ให้ Redirect เพื่อเก็บข้อมูลไว้ใน Text File
อ่านข้อมูลใน Text File เข้ามาทีละบรรทัด จนกว่าจะหมดข้อมูล
ค้นหาคำว่า Physical Address เช่น
Physical Address. . . . . . . . . : 00-00-00-99-99-99
เมื่อเจอข้อมูลที่ต้องการ
- ให้ตัดช่องว่างทั้งหน้า และ หลังออก (คำสั่ง TRIM)
- ให้นับข้อมูลจากทางขวามา 17 ตัว คือ MAC Address 12 ตัว และ เครื่องหมาย - อีก 5 ตัว
ออกแบบโปรแกรม (Design - Time)
RUN TIME
เริ่มต้นกระบวนการทำงาน
Option Explicit
' อ่านรายละเอียดเพิ่มเติมได้ที่ ...
' http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/cmd.mspx?mfr=true
' อ่านเรื่องการทำ Redirect
' http://www.uv.tietgen.dk/staff/mlha/PC/Soft/DOS/com/
Private Sub Form_Load()
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
txtMACAddress.Text = ""
Timer1.Enabled = False
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' เรียกใช้งานโปรแกรมย่อยเพื่ออ่านค่า MAC Address
Call GetMACAddress
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End Sub
' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' โปรแกรมย่อยที่เรียกใช้งานผ่าน Command DOS
' บทพิสูจน์ของ ... จินตนาการ ... ที่มาจากความรู้เก่าๆ เก๋าๆ และ ใช้มันอยู่ประจำ
' เทคโนโลยีแม้จะก้าวไกลไปถึงไหนก็ตามที ... หากนำมาใช้งานไม่เป็น มันก็ไร้ค่า ...
' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub GetMACAddress()
On Error GoTo ErrHandler
Dim sCommand As String ' คำสั่งผ่าน DOS
Dim strData As String ' อ่านค่าจาก Text File ครั้งละบรรทัด
' ตรวจสอบว่าเจอไฟล์เดิมหรือไม่ ... หากพบก็ให้ลบทิ้ง (Kill) ไปได้เลย
If Dir(App.Path & "\MyIPConfig.txt") <> "" Then Kill App.Path & "\MyIPConfig.txt"
' ASCII Code 34 คือ เครื่องหมาย Double Quote (")
sCommand = "ipconfig /all > " & Chr(34) & App.Path & "\MyIPConfig.txt" & Chr(34)
' ซึ่งจำเป็นต้องใส่เครื่องหมาย Double Quote (") ด้วยน่ะครับ .. เช่น ...
' ipconfig /all > "G:\Project VB60\GetMACAddress\MyIPConfig.txt"
' เครื่องหมาย > (หรือ Redirect) เป็นการเปลี่ยนทิศทางเพื่อส่งออกไปยังไฟล์ข้อมูล (แทนที่จะออกหน้าจอภาพตามปกติ)
' สั่งรันคำสั่ง cmd และตามด้วยคำสั่ง DOS ต่อท้ายได้เลย
Shell ("cmd /c " & sCommand)
' Option /c คือ เมื่อรันคำสั่งเสร็จสิ้น ให้ปิดหน้าต่าง DOS หนีไปเลย ไม่ต้องมาสะเออะ ... เชอะ 55555+
' เครื่องมันทำงานเร็วเกินไป (อย่างนี้ก็มีด้วย) ... หน่วงเวลาเอาไว้สักครึ่งวินาที (500 millisecond)
' ไม่เช่นนั้นมันจะหาไฟล์ไม่เจอ ทำให้เกิด Error 53 หรือ File not found. ... ไม่เชื่อผมก็ลองทดสอบดู
If Dir(App.Path & "\MyIPConfig.txt") = "" Then DelayTime (500)
' เปิดอ่านไฟล์
Open App.Path & "\MyIPConfig.txt" For Input As #1
Do While Not EOF(1)
' อ่านข้อมูลเข้ามาทีละบรรทัด
Line Input #1, strData
' เร่งการค้นหาโดยการข้ามบรรทัดที่เป็นช่องว่างออกไปได้เลย
' คือ ... บรรทัดไหนที่ไม่มีข้อมูล ก็ให้วนรอบไปรับข้อมูลบรรทัดใหม่
If Trim(strData) <> "" Then
' ตรวจสอบหาคำว่า Physical Address ในแต่ละบรรทัด
If InStr(Trim(strData), "Physical Address") Then
' เมื่อเจอ ... ให้นับตัวอักขระ (Character) จากทางขวามือมาทั้งหมด 17 ตัว
' เช่น ... 00-00-00-FF-FF-FF
txtMACAddress.Text = "MAC Address : " & Right$(strData, 17)
Exit Do
End If
End If
Loop
ExitProc:
' ปิด Text File
Close #1
Exit Sub
ErrHandler:
' บ่อยครั้งที่เราต้องมาดักความผิดพลาด (Trap Error)
MsgBox Err.Number & " : " & Err.Description
' หากสั่ง Resume Next ... คือ การสั่งให้กระโดดไปทำงานต่อจากบรรทัดที่เกิด Error ทันที
' หากสั่ง Resume ExitProc ... คือ การสั่งให้กระโดดไปที่ลาเบล ExitProc
' หากสั่ง Resume ... คือ การสั่งให้กลับไปทำงานซ้ำบรรทัดที่เกิด Error
Resume
' ไม่สั่ง Resume หรือ อะไรเลย ... ก็อ่านคำสั่งบรรทัดต่อไป ...
' แน่นอนเจอ Exit Sub หมายความว่า จบโปรแกรมย่อยไปเลย ... 55555+
End Sub
' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ส่วนของการหน่วงเวลา (Delay Time)
' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub DelayTime(MilliSec As Long)
' กำหนดให้ MilliSecond เป็นพารามิเตอร์เพื่อรับค่าการหน่วงเวลาเข้ามา
' Turn Timer1 On - เปิด
Timer1.Enabled = True
Timer1.Interval = MilliSec
' ไม่ใช่ว่ามันไม่ได้ทำอะไรน่ะครับ ... พี่น้อง
While Timer1.Interval > 0
' คืน CPU ให้กับระบบปฏิบัติการ (Operating System - OS) ไปทำงานอย่างอื่นต่อ
DoEvents
Wend
' Turn Timer1 Off - ปิด
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
' ปิดการทำงานของ Timer1
Timer1.Enabled = False
Timer1.Interval = 0
End Sub
|
Conclusion: พี่น้องครับ ... คงจะเห็นแล้วว่าด้วยหลักการง่ายๆแบบนี้ เพียงอันเดียว ครั้งเดียวเท่านั้น กลับสามารถที่จะนำไปใช้ประโยชน์ได้อย่างมากมาย ไม่เชื่อก็ดูโค้ดด้านล่าง หากผมอยากรู้ ชื่อเครื่องคอม ชื่อผู้ใช้ หรืออื่นๆ ผมก็ไม่มีความจำเป็นต้องพึ่งพาหา WinAPI 32 มาใช้งานสักกะติ๊ดเลยครับผม (แต่ขอให้รู้คำสั่ง DOS ด้วยน่ะ) ...
net config rdr > NetConfig.txt
Computer name \\THONGKORN
Full Computer name Thongkorn
User name Administrator
Workstation active on
NetbiosSmb (000000000000)
NetBT_Tcpip_{6339B9DD-B200-4E47-82B9-D5A8E053FE89} (00FFFFFFFFFF)
Software version Windows 2002
Workstation domain WORKGROUP
Workstation Domain DNS Name (null)
Logon domain THONGKORN
COM Open Timeout (sec) 0
COM Send Count (byte) 100
COM Send Timeout (msec) 250
The command completed successfully.
|
|
|