การแนะนำ
การพัฒนาโปรแกรมเว็บก่อให้เกิดความท้าทายอย่างมากต่อเครื่องมือในการพัฒนา บริษัทหลายแห่งได้เปิดตัวแพลตฟอร์มการพัฒนาจำนวนมาก: แพลตฟอร์มสำหรับการพัฒนาแอปพลิเคชันเดสก์ท็อปและโปรแกรม C/S, แพลตฟอร์มสำหรับการพัฒนามิดเดิลแวร์ และแพลตฟอร์มสำหรับการพัฒนาเว็บ เซิร์ฟเวอร์ ส่งผลให้โปรแกรมเมอร์ต้องเผชิญกับเครื่องมือจำนวนมากโดยไม่มีทางเริ่มต้นได้
DELPHI แตกต่างจากเครื่องมือพัฒนาอื่นๆ เนื่องจากเป็นระบบเปิด ตราบใดที่การควบคุมบางอย่างใช้อย่างยืดหยุ่น ระบบต่างๆ ก็สามารถพัฒนาได้ ไม่ว่าจะเป็นโปรแกรม N-Tie, โปรแกรมแบบมัลติเธรด, โปรแกรมคอมพิวเตอร์แบบกระจาย (รวมถึง DCOM และ CORBAR ), โปรแกรม TCP, โปรแกรมเว็บ, ActiveX, มิดเดิลแวร์, โปรแกรมพุช และคุณยังสามารถใช้เขียนโปรแกรมแอสเซมบลีได้อีกด้วย
DELPHI สรุป ISAPI/NSAPI/CGI/WCGI และอื่นๆ ไว้ในคลาสอย่างชาญฉลาด ผู้ใช้สามารถรับระบบที่แตกต่างกันได้ตราบใดที่พวกเขาเลือกผลลัพธ์การคอมไพล์ระหว่างการคอมไพล์
ใน DELPHI4 นั้น InPRise ได้เสริมความแข็งแกร่งในการสนับสนุนการพัฒนาโปรแกรมเว็บและสามารถพัฒนาระบบที่ดีขึ้นและแข็งแกร่งขึ้นได้ ต่อไปนี้เป็นปัญหาทั่วไปหลายประการในการพัฒนาเว็บแอปพลิเคชันเพื่อใช้อ้างอิงของคุณ หากไม่มีข้อความพิเศษ แสดงว่าโปรแกรมทำงานภายใต้ DELPHI 4
จะคืนรูปภาพจากแอปพลิเคชันเว็บเซิร์ฟเวอร์ได้อย่างไร
แอปพลิเคชันเซิร์ฟเวอร์เว็บไม่เพียงแต่สามารถสร้างเอกสารหน้าที่ซับซ้อนเท่านั้น แต่ยังส่งคืนรูปภาพที่แตกต่างกันตามคำขอของผู้ใช้อีกด้วย แน่นอนว่ายังมีวิธีที่ง่ายกว่านั้น แท็ก <img src...> ยังชี้ไปยังที่อยู่ URL ที่แตกต่างกัน ทั้งนี้ขึ้นอยู่กับพารามิเตอร์อินพุต เราไม่ได้ใช้วิธีนี้ที่นี่ แต่ใช้ DLL เพื่อส่งคืนรูปภาพ
แน่นอน คุณต้องสร้างคอนเทนเนอร์เพจ (ผู้สร้างเพจ) ก่อนด้วยเนื้อหาต่อไปนี้:
〈html〉
〈body〉นี่คือการทดสอบ〈BR〉〈img src=″/scripts/mydll.dll/picture″〉〈/body〉
〈/html〉
ต่อไป เราตั้งค่าเหตุการณ์การดำเนินการที่สอดคล้องกับ PathInfo และส่งคืนผลลัพธ์ของรูปภาพ ซอร์สโค้ดจะเป็นดังนี้:
(หมายเหตุ: ต้องรวมหน่วย JPEG ไว้ในการประกาศหน่วย)
ขั้นตอน TWebModule1.WebModule1WebActionItem1Action (ผู้ส่ง: TObject; คำขอ: TWebRequest; การตอบสนอง: TWebResponse; var จัดการ: บูลีน);
var
JPG: TJpegImage;
S: TMemoryStream;
เริ่ม
Jpg := TJpegImage.Create;
พยายาม
Jpg.LoadFromFile(′ทดสอบ′);
S := TMemoryStream.Create;
พยายาม
Jpg.SaveToStream(S);
ตำแหน่ง S := 0;
Response.ContentType := 'image/jpeg';
การตอบสนอง ContentStream := S;
//ต้องดำเนินการให้เสร็จสิ้นก่อนสตรีมจะถูกเผยแพร่
การตอบสนอง SendResponse;
ในที่สุด
ส.ฟรี;
จบ;
ในที่สุด
JPG.ฟรี;
จบ;
จบ;
จริงๆ แล้ว วิธีนี้ปลอดภัยกว่าและยืดหยุ่นกว่าวิธีง่ายๆ ที่กล่าวมาข้างต้น สามารถใช้งานได้อย่างยืดหยุ่นในบางสถานที่ และการปรับเปลี่ยนเล็กน้อยตามนั้นสามารถสร้างเอฟเฟกต์ที่ยากต่อการบรรลุด้วยเครื่องมือการพัฒนาทั่วไป
จะใช้ไดรเวอร์การเข้าถึงดั้งเดิมกับไลบรารีลิงก์ไดนามิก (DLL) ของ ISAPI / NSAPI ได้อย่างไร
เนื่องจาก DAO 3.0 หรือ DAO 3.5 เป็นสิ่งที่เรียกว่า thread-safe (โปรแกรม thread-safe) และเว็บเซิร์ฟเวอร์ (เช่น IIS) จะสร้างหลายเธรดตามคำขอของผู้ใช้ และยังแสดงรายการ DLL ที่สอดคล้องกับ ISAPI เป็น ด้าย ในเวลานี้ ISAPI จะแจ้ง DAO ผ่านทาง BDE โดยแจ้งว่าไม่ปฏิบัติตามกฎระเบียบด้านความปลอดภัยของเธรด
มีวิธีแก้ไขปัญหามากมาย หากคุณต้องเข้าถึงไลบรารี Access 95/97 คุณสามารถเข้าถึงได้ผ่าน ODBC ODBC ไม่ผ่าน DAO และยังเป็นโปรแกรมที่ปลอดภัยสำหรับเธรดอีกด้วย นอกจากนี้ ยังมีชุดการควบคุมของบริษัทอื่นบางชุดที่สามารถเข้าถึง Access 95/97 ได้โดยตรงจาก BDE ซึ่งมีประสิทธิภาพมากกว่า
ผู้ใช้เข้าถึง ISAPI DLL บนเว็บเซิร์ฟเวอร์ของฉัน แต่รายงานว่า: "ชื่อไฟล์ไม่ถูกต้อง" แม้ว่าไฟล์นั้นจะมีอยู่ก็ตาม ยังไงก็ตาม ฐานข้อมูลของฉันอยู่บนเซิร์ฟเวอร์ Novell ทำไมเป็นเช่นนี้?
คุณยังไม่ได้กำหนดค่าการแมปเส้นทางไดรฟ์ (MAPING) ที่สอดคล้องกับบัญชี IUSR_XXX ของคุณ เนื่องจาก Novell ไม่ได้ใช้ FAT จึงต้องเพิ่มการแมปเส้นทางด้วยตนเอง แน่นอนว่ามันสามารถสร้างเป็นสคริปต์ล็อกอินสำหรับบูตได้ โปรดทราบว่าหากคุณใช้งาน IIS เป็นเว็บเซิร์ฟเวอร์ และคุณเกี่ยวข้องกับ Novell ไม่ว่าจะเป็นไฟล์เซิร์ฟเวอร์หรือเซิร์ฟเวอร์ฐานข้อมูล คุณต้องกำหนดการแมปพาธ
"พารามิเตอร์การกำหนดค่าไม่ถูกต้องสำหรับนามแฝง {alias_name}" (การกำหนดค่านามแฝงไม่ถูกต้อง) ข้อผิดพลาดดังกล่าวเกิดขึ้นเมื่อฉันตั้งค่า ODBC DSN และเข้าถึงเซิร์ฟเวอร์ ISAPI/NSAPI ผ่านพารามิเตอร์ดังกล่าว
หากคุณต้องการสร้างนามแฝง ODBC สำหรับผู้ใช้ที่เข้าถึง (ผู้ใช้ IIS) โปรดใช้ความระมัดระวังในการสร้าง SYSTEM DSN (DNS ของระบบ) แทนการสร้าง "DNS ของผู้ใช้" แม้ว่า "DNS ของผู้ใช้" จะเป็นการตั้งค่าเริ่มต้นก็ตาม
จะรับชื่อและที่อยู่ IP ของไคลเอนต์ (เครื่องที่เข้าถึง) ได้อย่างไร?
มันง่ายมากที่จะใช้ฟังก์ชันนี้โดยใช้การควบคุม TCP เลือกตัวควบคุม TCP จากหน้าอินเทอร์เน็ตและรับสิ่งที่คุณต้องการโดยตรง:
Memo1.Lines.Add(TCP1.LocalHostName);
Memo1.Lines.Add(TCP1.LocalIp);
แน่นอนว่า หากคุณไม่ต้องการทำเช่นนี้ ก็มีวิธีที่ซับซ้อนกว่านี้:
ใช้ Winsock;
ขั้นตอน TForm1.FormCreate (ผู้ส่ง: TObject);
var
wVersionRequested : Word;
wsaData : TWSAData;
เริ่ม
{สร้าง WinSock}
wVersionRequested := สร้างคำ (1, 1);
WSAStartup(wVersionRequested, wsaData);
จบ;
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
var
p: PHostEnt;
s : array[0..128] ของถ่าน;
p2: pchar;
เริ่ม
{รับชื่อคอมพิวเตอร์}
GetHostName(@s,128);
p:=GetHostByName(@s);
Memo1.Lines.Add(p^.h_Name);
{รับที่อยู่ IP ของเครื่อง}
p2 := iNet_ntoa(PIInAddr(p^.h_addr_list^)^);
Memo1.Lines.Add(p2);
จบ;
ขั้นตอน TForm1.FormDestroy (ผู้ส่ง: TObject);
เริ่ม
{ปล่อย WinSock}
WSACleanup;
จบ;
นี่คือหน่วยอิสระที่เรียกว่า WINSOCK ซึ่งคุณสามารถฝังลงในโปรแกรมของคุณได้โดยตรง
เหตุใดฉันจึงไม่สามารถสร้าง DLL แบบมัลติเธรดที่แท้จริงใน DELPHI 3 ได้
แม้ว่าตัวช่วยสร้าง ISAPI DLL ใน DELPHI3 จะสร้างโค้ดจำนวนมากสำหรับการสร้าง DLL แบบมัลติเธรด แต่ก็ยังมีข้อบกพร่องร้ายแรง: ไม่ได้ประกาศว่าแอปพลิเคชันนี้เป็นโปรแกรมแบบมัลติเธรด ดังนั้นคุณต้องเพิ่มประโยค:
IsMultiThread := จริง;
วางประโยคนี้ไว้ที่จุดเริ่มต้นของบล็อกเริ่มต้นและสิ้นสุดของโปรแกรม DPR ทำให้เป็นประโยคแรก
ฉันจะรู้ได้อย่างไรว่าฉันเชื่อมต่อกับอินเทอร์เน็ตอยู่ในขณะนี้?
วิธีที่ง่ายที่สุดคือการใช้ส่วนประกอบ TCP เพื่อรับ IP ปัจจุบันของคุณ และตรวจสอบว่าคุณเชื่อมต่อกับอินเทอร์เน็ตหรือไม่โดยการตัดสิน IP ตัวอย่างเช่น:
ถ้า TCP1.LocalIp = '0.0.0.0' แล้ว
ShowMessage('ขณะนี้ไม่ได้เชื่อมต่อกับอินเทอร์เน็ต!');
ควรสังเกตว่าเนื่องจากไม่มีความแตกต่างที่สำคัญระหว่างอินเทอร์เน็ตและอินทราเน็ต โดยทั่วไปจึงเป็นไปไม่ได้ที่จะระบุได้ว่าเชื่อมต่อกับอินเทอร์เน็ตหรือเพียงแค่เชื่อมต่อกับอินทราเน็ตเท่านั้น แน่นอน. คุณยังสามารถเพิ่มส่วนประกอบ PING ลงใน PING ซึ่งเป็นไซต์ที่ค่อนข้างเสถียรและรวดเร็ว หากเชื่อมต่ออยู่ แสดงว่าคุณสามารถเข้าถึงอินเทอร์เน็ตได้ อย่างไรก็ตาม วิธีการนี้ไม่มีความหลากหลายมากนัก
จะพิมพ์หน้าเว็บได้อย่างไร?
คุณสามารถเลือกใช้วิธี AutoPrint ของตัวควบคุม HTML ได้ ตัวอย่างเช่น:
ใช้เครื่องพิมพ์
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
var
OldCur: Tเคอร์เซอร์;
เริ่ม
OldCur := หน้าจอเคอร์เซอร์;
ด้วยเครื่องพิมพ์ทำ
เริ่ม
บีกินหมอ;
HTML1.AutoPrint(จัดการ);
หัวข้อ := HTML1.URL;
EndDoc;
จบ;
หน้าจอเคอร์เซอร์ := OldCur;
จบ;
นอกจากนี้คุณยังสามารถใช้วิธี PrintPage ได้อีกด้วย อย่างไรก็ตาม ฉันขอแนะนำให้คุณใช้การพิมพ์อัตโนมัติ เนื่องจากการควบคุมนี้มีความยืดหยุ่นมากกว่าและสามารถกรองเนื้อหาบางส่วนที่คุณไม่ต้องการพิมพ์ได้
บล็อกของผู้เขียน: http://blog.csdn.net/zou5655/