ตุลาคม 21, 2019, 03:47:01 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: How to load a Bitmap, stored in dll, and display on a Picture Control (MFC)  (อ่าน 5859 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« เมื่อ: สิงหาคม 14, 2011, 12:41:03 pm »

DLL เป็นที่รู้จักกันในนามของไลบรารี่ซ่อนโค๊ด (ใช้อย่างเดียว ไม่ต้องรู้ว่าอะไรอยู่ข้างใน)
นอกจากข้อดีในส่วนของการนำไปใช้งานได้ง่ายๆ ในมุมมองของผู้ใช้แล้ว ยังมีข้อดีในส่วนของ
ผู้พัฒนาเป็นทีมใหญ่ๆ ที่มีการแชร์ไลบรารี่ที่ผ่านการตรวจสอบและทดสอบจนเรียกว่าเต็ม 100%
ไม่ต้องเสียเวลา copy code มาทำการ compile ใหม่ หรือเขียนใหม่ ในเชิงการค้า ความปลอดภัย
การละเมิดสิทธิ์ และต่างๆ เจ้า DLL ก็เข้ามามีบทบาท เพราะบ่อยครั้ง โปรแกรมเมอร์ที่เรียกตัวเองว่า
"Cracker" จะใช้ความรู้ในทางผิด มาโจรกรรมข้อมูลการใช้งาน หรือ พฤติกรรมของผู้ใช้คอมพิงเตอร์
รู้แบบนี้แล้ว ก็อย่าใช้สิ... ไม่มีทางครับ ตราบเท่าที่คุณยังคงใช้โปรแกรมคอมพิวเตอร์อยู่ สิ่งเหล่านี้
จะเกิดได้อย่างง่ายดาย ศาสตร์มืดเหล่านี้จริงๆแล้วไม่ได้มีอะไรเกี่ยวข้องโดยตรงกับ DLL แต่เหมือนกัน
ตรงที่มันทำอะไรอยู่ข้างใน เราไม่รู้ มันสั่งให้โปรแกรมที่คุณใช้อยู่ส่งข้อมูลต่างๆไปให้นายของมัน
หรือให้นายของมัน remote เครื่องคอมพิวเตอร์ของเรา เราไม่รู้ ใครจะกล้ายืนยันว่าเกมส์ที่คุณนั่ง
เล่นอยู่มันเป็นแค่เกมส์ ใครจะกล้าการันตีว่าโปรแกรมที่คุณใช้อยู่มันเป็นเพียงโปรแกรมคอมพิวเตอร์ธรรมดา
แน่นอน.. ไม่มีใครรู้ ผู้ใช้จะรู้ในส่วนของการทำงานที่เรียกว่า Foreground เท่านั้น แต่ Background หมดสิทธิ์

อยู่มาวันนึง Cracker เกิดเจอปัญหาว่าไม่สามารถควบคุมเครื่องของเราได้แล้ว ก็บอกให้โปรแกรมบอกเราว่า
"update หน่อย ไม่เช่นนั้นจะใช้ไม่ได้" เราก็ทำตามมัน การ update ก็คือการโยน DLL ตัวใหม่เข้ามาในเครื่อง
มาเป็นพฤติกรรมของการโจรกรรมเป็นรูปแบบใหม่ หรือรูปแบบที่ดีขึ้น เก่งขึ้น และแยบยลขึ้น

นั่นเป็นเพียงแค่การ Introduction เพื่อเรียกร้องความสนใจครับ ถึงมันจะมีอยู่จริง แต่น้อยมาก ข้อดีของ DLL
ไม่ได้เกี่ยวกับมนต์ดำ หรือศาสตร์มืดแต่อย่างใด แต่มันเป็นการเปลี่ยนโลกของนักพัฒนาโปรแกรม ให้ง่ายขึ้น
เพิ่มความสามารถของโปรแกรม หรือรูปแบบของโปรแกรม เพียงแค่เปลี่แยน dll เท่านั้น โดยที่ไม่จำเป็นต้อง
ทำการ Compile เพือสร้าง exe ขึ้นมาใหม่ให้เสียเวลา และยังมีข้อดีต่างๆ อีกมากมาย

ในตอนนี้ผมจะยกตัวอย่างที่แตกต่างออกไปจาก DLL ทั่วไป นั่นคือการดึง Resource จาก dll มาใช้
ในที่นี้ Resource คือไฟล์รูป (BMP) ซึ่งได้ถูก Compile เป็น dll ไว้แล้ว แทนที่จะเก็บเป็นไฟล์ Bitmap
ไม่เอา เก็บเป็น dll แทน แล้วให้โปรแกรมของเราเปลี่ยนเป็นภาพแทน

สมมุติว่าเรามีไฟล์ dll ชื่อ "MyDLLBitmap.dll" ซึ่งเก็บข้อมูลภาพ Bitmap รูปนี้ไว้



เราจะนำรูปนี้มาทำการแสดงบน Picture Control (MFC) สิ่งแรกที่ต้องทำคือการสร้าง Application
แบบ Dialog based และ นำ Picture  Control มาวาง จากกนั้นกำหนดชื่อเป็น IDC_IMG1


ต่อไปก็ทำการโหลดตัว dll มาใช้
Code: (c)
HMODULE hModule = ::LoadLibrary("MyDLLBitmap.dll");
if(!hModule){
    ::MessageBox(0, "Cannot Load MyDLLBitmap.dll.", "DLL Loading Error", 0);
    exit(0);
}


ตามด้วยการโหลดรูป หรือ Bitmap ที่อยู่ใน dll
Code: (c)
HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadBitmap(hModule, MAKEINTRESOURCE(101));
// หรือ hBitmap = (HBITMAP)LoadBitmap(hModule, LPCSTR(101));
if(!hBitmap){
    ::MessageBox(0, "Cannot Load Bitmap from dll.", "Bitmap Loading Error", 0);
    ::FreeLibrary(hModule);
    exit(0);
}


สร้างหน่วยความจำ DC สำหรับการแสดงผล
Code: (c)
HWND hWnd;
GetDlgItem(IDC_IMG1, &hWnd);
HDC hdc=::GetDC(hWnd);
HDC hMemDC = ::CreateCompatibleDC(hdc);
::SelectObject(hMemDC, hBitmap);


ตามด้วยการหาขนาดของ Picture Control
Code: (c)
int w, h; RECT r;
::GetClientRect(hWnd, &r);
w = r.right;
h = r. bottom;


ทำการ copy ข้อมูลภาพไปยัง Picture Control
Code: (c)
::SetStretchBltMode(hdc, STRETCH_HALFTONE);
::StretchBlt(hdc, 0, 0, w, h, hMemDC, 0, 0, bi.bmWidth, bi.bmHeight, SRCCOPY);


จบด้วยการลบหน่วยจวามจำ และปิดการใช้งาน dll
Code: (c)
::DeleteDC(hMemDC);
::ReleaseDC(NULL, hMemDC);
::FreeLibrary(hModule);


** การสร้าง Pure Resource DLL ไม่ต้องมี Entry point นั่นคือไม่ต้องเขียน code แม้แต่บรรทัดเดียว **

ผลที่ได้คือ:


ตอนนี้ลองนึกภาพถึงโปรแกรมที่มีความสามารถในการเปลี่ยน Theme หรือรูปร่างหน้าตา เช่น สี
รูปร่างของปุ่มกด ตัวอักษร รวมไปถึงเสียง ทั้งหมดทั้งมวลนั้น สามารถเปลี่ยนได้โดยการเปลี่ยน
DLL เป็นตัวใหม่ หรือเปลี่ยนตำแหน่งอ้างอิงของ DLL ในตัวเดียวกันนี้ ยกตัวอย่างเช่นตัวนี้ ผมได้ทำการ
นำ Bitmap ไปวาดบน Button หรือให้เป็นรูปร่างน่าตาที่ต้องการ



นี่เป็นตัวอย่างการใช้งาน DLL เพียงเศษเสี้ยวเท่านั้น ข้อสังเกตุที่เห็นได้อย่างชัดเจนคือ
ทั้งผู้พัฒนา และผู้ใช้งาน DLL จะต้องมีความรู้ความเข้าในใจการเขียนโปรแกรมเกินขีด
ที่เรียกว่า ขั้นพื้นฐาน แต่น่าเสียดายการที่จะก้าวข้ามผ่านขั้นพื้นฐานไปได้ ไม่ได้ทำกันได้
โดยไม่ทุ่มเทเวลาเพื่อการศึกษา ผมเองก็กำลังทุ่มเทเวลาศึกษาอยู่เช่นกัน และหวัง
เป็นอย่างยิ่งว่าความรู้ที่ผมได้ศึกษาไป และนำมาพูดในที่นี้จะเป็นประโยชน์สำหรับ
ใครที่ต้องการพัฒนาโปรแกรมในระดับใช้งานจริงจังต่อไป


บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #1 เมื่อ: สิงหาคม 14, 2011, 02:39:31 pm »

อ่านตอนแรก ตื่นเต้นมากเลยครับ  :o: เหมือนกำลังอ่านนิยายแนว sci-fi คอมพิวเตอร์อะไรประมาณนั้น  :grin:

จริงๆ ถ้ามีใครโยนไฟล์ dll ให้เราสักไฟล์ โดยไม่บอกอะไรเราเลย เราจะเอาไปใช้งานได้อย่างไร หรือ แม้กระทั่ง เราต้องการใช้่ function ที่เก่งกาจตัวนึง จากโปรแกรมราคาแัพงนับแสน เราจะทราบได้อย่างไรครับ ว่าต้องเอา parameter อะไรใส่เข้าไปบ้าง หรือจะได้ เอาท์พุต ออกมาเป็นอะไร ถ้าเราเรียก dll ไฟล์นี้

มันต้องมี user manual ให้เราใช่ไหมครับ หรือว่ามีทางอื่น ที่เราจะรู้ได้ โดยไม่มี user manual ครับ

บันทึกการเข้า

ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #2 เมื่อ: สิงหาคม 14, 2011, 03:20:17 pm »

DLL ที่ตั้งใจปิดบังอย่างจริงจัง ไม่สามารถนำมาให้ได้โดยไม่มี Manual หรือ header file


แต่ในโลกของ computer สามารถทำได้ โดยการใช้โปรแกรมว่าด้วยการดูการทำงานของ dll เข้ามาช่วย
โปรแกรมในกลุ่มนี้จะถูกเรียกว่า DLL Viewer หรือชื่ออื่นๆ  ที่ใกล้เคียงกัน แต่ใช่ว่าการเห็นสิ่งต่างๆ จะสามารถนำ dll นิรนาม
สักตัวหนึ่งไปใช้ได้ง่ายๆ โดยไม่มีความรู้ด้านการ Hacking หรือ Cracking (ความรู้ระดับลึกเกือบสุดขั้ว) การจะ crack
โปรแกรมราคาแพงนับแสน อาจจะต้องเผชิญหน้ากับ dll นับร้อย ไม่ง่ายเลย ในฐานะนักพัฒนา การจะไป crack dll สักตัวนึงอาจ
ไม่คุ้มค่า และอาจเสียเวลามากกว่านั่งเขียนใหม่เองหลายเท่าตัว

ในโลกของการค้า จะต้องยอมให้โปรแกรมถูก crack เพื่อให้ user ทางบ้านนำไปใช้ฟรีๆ เป็นการโฆษณาทางอ้อม แบบถึงตัว
เมื่อเขาเหล่านั้นออกจากบ้าน ก็จะไขว่คว้าหาของที่ตัวเองใช้เป็นมาใช้ในที่ทำงาน หน่วนงานในฐานะผู้หาผลประโยชน์จาก
software จึงต้องจ่าย ถ้าขโมยใช้ อาจร้ายแรงถึงล่มจมกันเลยทีเดียว

บริษัทขาย Antivirus เขียน Virus ออกปล่อยเองฉันใด บริษัทผู้ผลิตก็ปล่อย Cracker ออกมาเองฉันนั้น มันเป็นสัจธรรม
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: