วันอังคารที่ 14 มกราคม พ.ศ. 2557

การเขียน Batch File เชื่อมต่อ VB6 ตอนที่ 2

การนำคำสั่งแบทไฟล์ทั้งดุ้น...บรรจุลงใน VB6
   หลายท่านอาจสงสัยว่า...ทำไมไม่ยัดคำสั่ง DOS ใส่ลงใน VB6 เลย...ไม่เห็นต้องเขียนให้คนอื่นๆ รู้ สามารถทำได้เช่นกันครับ...ข้อดีของมันคือ...ไม่ต้องแสดงให้คนอื่นรู้ว่าแบตช์ไฟล์เราเขียนอย่างไร...(เช่นเดียวกับ Batchfile to EXE หรือคอมไพล์เลอร์แบตช์ไฟล์ตามท้องตลาด) แต่ข้อเสียคือการแก้ไขปรับปรุงต้องทำการคอมไพล์ .EXE ใหม่ทุกครั้ง...เสียเวลามาก...
      เขียนแบตช์ไฟล์แทรกลงในบรรทัด VB6 เหรอ...ยากจัง?
      ตอบ ไม่จำเป็น เพียงแค่รู้คำสั่งจัดการแฟ้มของ VB6 เท่านั้น ส่วนโค้ดแบตช์ไฟล์ยัดใส่ใน Text Control เอาเท่านั้น...ไม่เห็นยุ่งยาก...
      และมันลองรับภาษาไทยไหม?
      ตอบ ลองรับครับ...ถ้าเลือกฟอนต์ของ Text Control ถูกต้อง ก็อ่านเขียนภาษาไทยได้ไม่ผิดเพี้ยน
มาเริ่มกัน...
นี้คือตัวอย่างโค้ดแบตช์ไฟล์ที่ต้องการทำเป็น .EXE แบบเท่ห์ๆ (ตัวอย่าง)
@echo off
title Unhiden Folder...by Tanatdech  Boonluelak
color a
echo.
echo        __   __   ________  __  __    _______  _____  ___     __
echo       / /  / /  / ____  / /_ \/  \  /____  / /__  / / _/    / /
echo      / /  / /  / /_  / /   / / \ / ___  / /    / /  \ \    / /
echo     / /  / /  / __/ / /   / / / / / _/ / /    / /    \ \  / /
echo    / /  / /  / /   / /   / / / / / /__/ /    / /    /  /_/ /
echo   /__/ /__/ /_/   /_/   /_/ /_/ /______/    /_/    /______/
echo.
echo Un Hiden File or Folder Beta...
echo https:\\www.thaibatchfile.blogspot.com
echo.
ping 127.0.0.1>nul
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  if "%%a"=="%1" (
    title Wait...
    echo Wait...?
    attrib -r -s -h -a %%a:\*.* /d /s
    title Unhiden Folder...by Tanatdech  Boonluelak
    echo Finish...!
  ))
*** โปรแกรมนี้...เก๋อ...มาก...มีเยอะมาก Un Hidden File  หรือเรียกอย่างอีกอย่างว่า...กู้ไฟล์ซ่อนจากไวรัสให้หนูที...(บางคนจำคำสั่งไม่ได้...โพสต์บอกวิธีกันมา 6 ปีแล้ว...ทุกวันนี้...บางคนยังมาลงอัปเดรต อยู่เลย...ฉายซ้ำหลายรอบครับ...หนังเรื่องนี้)

1. เปิดตัว VB6 Portable ที่ให้ไปตอนที่ 1
2. สร้างโปรแกรมขึ้นมาโดยเลือกเครื่องมือ (Textbox จากภาพผิดนิดหน่อย)
3. คัดลอกแบตช์ไฟล์ที่ต้องการนำคำสั่งไป VB6 ***จากนั้นปิดโปรแกรม Notepad มิฉนั้นจะ Error


4. ปรับ Properties ของ Text1 เป็น Multiline เพื่อให้สามารถรับข้อมูลแบบหลาย บรรทัดได้
5. วางคำสั่งที่คัดลอกมาในช่อง Text เพื่อให้โค้ดแบตช์ไฟล์บรรจุใน VB6 (โดยไม่ต้องเขียนคำสั่งใหม่)
7. ปรับ Text1 เป้น Visible  False (ไม่แสดงที่ฟอร์ม) เพื่อไม่ให้เกะกะการแสดงผล
8. สร้างปุ่ม เรียกคำสั่ง ปรับ Caption เป็นข้อความที่ต้องการ ปรับ Font และ สีตามต้องการ
9. เพิ่ม Control Drive เข้ามา...เพื่อให้โปรแกรมสามารถเลือกไดร์ฟการทำงานได้ จากนั้นเพิ่ม Control ตามต้องการทั้งภาพ...ข้อความ แสง สี เสียง..
10. ดับเบิลคลิก ปุ่มเรียกคำสั่ง และบรรจุโค้ดคำสั่งเข้าไปตามนี้

Private Sub Command1_Click() ' ทำงานเมื่อคลิก
    Open "Unhiden.BAT" For Output As #1 ' สร้างแบตช์ไฟล์เพื่อเขียน
        Print #1, Text1.Text ' สร้างจาก Text1
    Close #1 ' ปิด
    Shell "cmd /c  Unhiden.BAT " & Left(Drive1.Drive, 1), vbMaximizedFocus ' เรียกคำสั่งแบตช์ไฟล์
End Sub


11. คอมไพล์โปปรแกรมตั้งชื่อ...โปรแกรมเป็นอันใช้งานได้


โปรแกรมนี้คุณไม่ต้องพกพา Batch File ไปควบคู่....เพราะมันถูกบรรจุไว้ใน .EXE เรียบร้อยแล้ว...และวิธีนี้คุณสามารถนำแบตช์ไฟล์ อีกนับสิบ...มาสร้างเป็นปุ่ม...โดยแยกแต่ละ Control เท่านั้น....คงไม่ยากจนเกินไปนะครับ...

การเขียน Batch File เชื่อมต่อ VB6 ตอนที่ 1

โดยทั่วไปแล้วหากพูดถึงเรื่องเขียนโปรแกรมสมัยนี้...คนส่วนใหญ่เบนเข็มไปศึกษา JAVA และ C++ เป็นส่วนใหญ่ เพราะมันเห็นผลเรื่องเงินหากเขียน แอฟขึ้นมาสักตัว...มียอดดาวน์โหลดเงินก็เข้ากระเป๋าเพียงลงทุนไม่กีพันบาท...จึงทำให้เนื้อหาเกี่ยวกับ VB6 และ Batch เป็นอะไรที่โบราณหากจะศึกษา (แต่ยังไงผมก็ยังดื่อแพ่ง...สอนเขียนโปรแกรมพวกนี้) โดยคนเหล่านั้นลืมมองไปว่า...พื้นฐานแต่ละคนมีไม่เท่ากัน...หรือเนื้อหาที่เน้นแต่ธุรกิจอย่างเดียว...มันไม่สนับสนุนด้านการศึกษาของบ้านเราเท่าไร...
      ว่ากันเรื่อง VB6 ทำไมต้องเขียนแบตช์ไฟล์เพื่อเชื่อมต่อกับ VB6 ด้วย ทำไมไม่เป็น VB.NET?
      คำตอบคือ...ถ้าคุณคิดจะเขียนด้วย VB.NET คุณไม่ต้องเขียนแบตช์แล้ว...มันมีคำสั่ง Console ให้ใช้งานเยอะแยะ...เรียกใช้งานแสงสีเสียงฟังก์ชั่นครบ...ยิ่งกว่า PowerShell เสียอีก
      และทำไมต้องเป็น VB6 กับ แบตช์ไฟล์?
      คำตอบคือ คุณจะหาอะไรง่าย ฟรีๆ ก็ทำงานได้ไม่แพ้กัน...ก็ต้องมันนี้แหละ...เหมือนคุณหิวตอนเช้า อาหารเช้า ก็ต้องเป็น แฮม กับ ไข่ดาว...มันเป็นของคู่กัน
ว่าแล้วก็มา...เริ่มเขียนกัน...ก่อนอื่น คุณต้องรู้ก่อนว่า...ภาษาทั้งสองเขียนไม่เหมือนกัน...***โดยสิ้นเชิง...และมันทำงานในคนละส่วนกัน...(จึงทำให้ Batch อยู่ในภาษาระดับ Console ส่วน VB6 อยู่บน Explorer Windows ที่มี GUI ครบ) การเขียนโปรแกรมเพื่อเชื่อมสองภาษานี้เพื่อ อาศัยขอดีของแต่ละภาษามาแลกเปลี่ยนกัน หรือทำมันให้ดีขึ้น
      มันติดต่อกันได้อย่างไร?
      ตอบ ผ่าน Argument และ Parameter ของ กันและกันดีที่สุด ไม่แนะนำให้เขียนติดต่อสื่อสารผ่านทาง Environment เพราะยุ่งยาก...ต้องเขียนตัวดักรอสถานะการณ์ เขียนคำสั่งขึ้นมายากกว่า...เข้าใจยากกว่า
เริ่มเลย

1. เปิด VB6 Portable ขึ้นมา...
1.1 ดาวน์โหลด VB6 Portable ก่อน form GoogleDrive (VB6 Portable)
1.2 คลิก VbProtable6.REG หรือ แฟ้มรูปลูกบาตร์สีฟ้า เพื่อให้ VB6 สามารถสร้าง .EXE ได้
1.3 เรียก VB6 ทำงาน


2.เลือก Standard EXE เพื่อให้มันสร้างแฟ้ม .EXE ของวินโดวส์


3. คลิกเครื่องมือ และสร้างมันขึ้นมาทีละตัวตามตัวอย่าง


4. กำหนด Properties แต่ละตัวให้ได้รูปแบบตามตัวอย่าง...(ถ้าใครไม่มีพื้นฐาน...ควรศึกษาก่อน)

5. วางโค้ดลงไปในฟอร์ม...ตามนี้
Private Sub Command1_Click() ' คลิกและทำงาน
    Dim OK As Boolean ' กำหนดตัวแปรเพื่อดูสถานะ OK
    Dim sArgs() As String ' กำหนดตัวแปรสำหรับรับ Argument
    Dim iLoop As Integer ' กำหนดตัวแปรนับ Parameter
    sArgs = Split(Command$, " ") ' ใช้ฟังก์ชั่น Split ตัดคำเก็บไว้ในอาเรย์
    OK = False ' ไม่ OK
    For iLoop = 0 To UBound(sArgs) ' วนจนกว่าข้อมูลในอาเรย์ เป็น 0
        If sArgs(iLoop) = Text1.Text Then OK = True ' ถ้า Argument ตรงกับ Text1.Text จริง OK
    Next ' ถัดไป
    If OK Then ' เมื่อ OK
        Shell "cmd /c LogIn.BAT OK" ' เรียก cmd รัน LogIn.BAT พารามิเตอร์  OK
        End ' ปิด .EXE
    Else '  ถ้าไม่
        MsgBox "รหัสผ่านไม่ถูกต้อง" ' แสดงข้อความ
    End If ' จบ
End Sub


6. สร้างแฟ้ม .EXE และคัดลอกไปยังตำแหน่งที่จะทดสอบ Batch File

7. สร้าง LogIn.BAT เพื่อติดต่อการทำงานระหว่างกัน
if "%1"=="OK" goto :OK
rem ถ้าพารามิเตอร์ VB6 ส่งมาเป็น OK ไปที่ OK
project1.exe 12345
rem เรียก project1.exe และ รหัสผ่าน (12345)
goto :EOF
rem จบคำสั่ง
:OK
rem ตำแหน่ง OK
msg %username% รหัสผ่านถูกต้อง
rem แสดงข้อความว่ารหัสถูกต้อง

จากโปรแกรมด้านบน...มันสามารถติดต่อสื่อสารระหว่างกันได้...โดย แบตช์ไฟล์รอการตอบกับก่อนขั้นตอนแรกจากนั้นเรียก .EXE ที่สร้างจาก VB6 พร้อมส่งค่ารหัสผ่านไปให้ (ทำไมไม่เก็บไว้ที่ VB6 เพราะถ้าเก็บไว้ใน .EXE มันไม่สามารถเปลี่ยนแปลงรหัสผ่านภายหลังได้นั่นเอง) จากนั้น .EXE จะทำงานรอการกรอกรหัสผ่าน ถ้ากรอกไม่ถูกต้อง ให้ VB6 แจ้งทันที...แต่ถ้าถูกต้องจะปิดตัวเองพร้อมส่งค่ากลับมาที่ แบตช์ไฟล์ แบตช์ไฟล์จะตรวจสอบและกระโดดไปยังตำแหน่งที่ต้องการทันที

      จะเห็นได้ว่า แบตช์ไฟล์เองก็สามารถติดต่อสื่อสารกับ .EXE ได้
      และทำไมไม่ติดต่อสื่อสารกับ VBScript ในแบบเดียวกัน?
      ตอบ ทำอย่างนั้นไม่ได้เพราะ VBScript นั้นทำงานผ่าน WScript.EXE อีกที...ซึ่งมีการเรียกพารามิเตอร์และอาร์กิวเมนต์ระหว่างกันอยู่แล้ว...การทำงานระหว่าง Batch File กับ VBScript ให้ทำงานผ่าน Environment ตามที่เสนอไปในตอนแรกๆ ให้ย้อนกลับไปดูเอา...