หมายเหตุnbsp หมายเหตุทางเทคนิคนี้ถูกเขียนขึ้นสำหรับ Windows 3.1 Windows NT ใช้คุณลักษณะเหล่านี้ส่วนใหญ่ เมื่อเรียกใช้โปรแกรมประยุกต์ของคุณภายใต้ Windows 3.1 (กับ Dll Win32s), เทคนิคต่าง ๆ เหล่านี้สามารถช่วยเหลือในการตรวจแก้จุดบกพร่อง Windows 95 ยังใช้ และขยายคุณลักษณะความคึกคักที่เก็บไว้ในระหว่าง Windows 3.1 เรียกใช้ตัวตรวจแก้จุดบกพร่องรุ่นของ Windows 95 เป็นวิธีดีที่สุดการประกันโปรแกรมประยุกต์ของคุณกำลังทำงานอยู่อย่างหมดจด(&N)?
Windows 3.1 มีการปรับปรุงที่สำคัญผ่าน Windows 3.0 ในพื้นที่ของการพัฒนาโปรแกรมประยุกต์ที่มีเสถียรภาพ Windows 3.1 ประกอบด้วยหมายเลขของคุณลักษณะใหม่ที่ช่วยเพิ่มความน่าเชื่อถือของโปรแกรมประยุกต์กับ Windows หมายเหตุทางเทคนิคนี้อธิบายเกี่ยวกับการใช้คุณลักษณะเหล่านี้ภายในไลบรารี MFC?
คุณลักษณะเหล่านี้รวมเคอร์เนลดีบัก การตรวจสอบชนิดเคร่งครัดการวินิจฉัย และการจัดการหน่วยความจำ และ WINDOWSXการปรับปรุง H?
เคอร์เนลดีบัก Windows 3.1
หมายเหตุnbsp ส่วนนี้ใช้ได้เฉพาะใน Microsoft Visual c ++รุ่น 1.5(&N)?
การทดสอบโปรแกรมประยุกต์ของคุณ MFC กับ executables ระบบการตรวจแก้จุดบกพร่องได้คงสิ่งดีที่สุดที่คุณสามารถทำได้เพื่อให้แน่ใจว่า โปรแกรมประยุกต์ของคุณมีเสถียรภาพ และน่าเชื่อถือ รุ่นแก้จุดบกพร่องของ executables ระบบทำการเรียงลำดับทั้งหมดประโยชน์ข้อผิดพลาดในการตรวจสอบคุณ แจ้งให้คุณทราบถึงปัญหาต่าง ๆ ที่เกิดขึ้นกับข้อความแสดงผลการตรวจแก้จุดบกพร่อง?
วิธีที่ดีที่สุดในการใช้ระบบการตรวจแก้จุดบกพร่องเป็นเครื่องจักรที่สอง: เครื่องจักรสำหรับการทดสอบ และการตรวจแก้จุดบกพร่องที่มีการติดตั้งระบบตรวจแก้จุดบกพร่องและเครื่องจักรสำหรับการพัฒนา หนึ่งเครื่องจักร เครื่องทดสอบของคุณ ควรเรียกใช้กับเคอร์เนลดีบักเสมอ อื่น ๆ เครื่อง เครื่องของคุณพัฒนา ควรรันกับเคอร์เนลไม่ใช่ตรวจแก้จุดบกพร่อง ผลผลิตจากเคอร์เนลดีบักสามารถถูกส่งไปยังเครื่องหลักผ่านสายโมเด็มค่า null ถ้ามีเพียงเครื่องเดียว แล้วคุณควรแน่ใจว่าได้เรียกใช้เคอร์เนลดีบัก (ไม่มีการลดน้อยประสิทธิภาพ) ผลผลิตจากเคอร์เนลดีบักสามารถถูกส่งไป DBWIN เครื่องมือที่รวมอยู่ใน Microsoft Visual c ++รุ่น 1.5 นอกจากนี้ หน้าต่าง Visual c ++ผลลัพธ์จะได้รับผลลัพธ์เมื่อรันอยู่ภายใต้การดีบัก?
เล่ห์เหลี่ยมมีประโยชน์สำหรับการดีบักเครื่องเดียวคือ การวางสำเนาของไบนารีของระบบและการตรวจแก้จุดบกพร่องและสัญลักษณ์ในไดเรกทอรีที่แยกต่างหาก และมีชุดแฟ้มที่คัดลอกแฟ้มเหมาะสมไปยังไดเรกทอรีระบบ Windows ของคุณ ด้วยวิธีนี้คุณสามารถออกจาก Windows และสลับไปมาอย่างรวดเร็วระหว่างการตรวจแก้จุดบกพร่องและการไม่ตรวจแก้จุดบกพร่อง โปรแกรมติดตั้งเวอร์ชัน 1.5 Visual c ++จะเซ็ตอัพข้อมูลนี้ แล้วคุณสามารถสลับระหว่างการตรวจแก้จุดบกพร่องและการไม่ตรวจแก้จุดบกพร่องรุ่นของ Windows ด้วย D2NBAT และ N2DBAT ชุดแฟ้ม?
ถ้าคุณไม่ได้ทำงานกับโปรแกรมดีบักหรือเทอร์มินัลการตรวจแก้จุดบกพร่อง คุณควรเรียกใช้แอปพลิเคชัน DBWIN เพื่อที่คุณสามารถเห็นความผิดพลาดและข้อความเตือนที่ผลิต โดยระบบการตรวจแก้จุดบกพร่อง โปรแกรมประยุกต์นี้ไม่มีอยู่ใน Visual c ++รุ่น 1.5?
ด้านล่างเป็นบางปัญหาการเขียนโปรแกรมทั่วไปที่ปรากฏบ่อยในแอปพลิเคชัน Windows จัดส่ง ปัญหาเหล่านี้อาจทำให้ระบบสุ่ม UAEs และปัญหาอื่น ๆ ภายใต้ Windows 3.0 ไบนารีระบบตรวจแก้จุดบกพร่องจะช่วยให้คุณติดตามลงปัญหา เช่น:
MFC การวินิจฉัย
นอก การจัดส่งของคลาสที่ Microsoft Foundation ด้วยชุดคุณลักษณะความคึกคักที่คอมไพล์ และการเชื่อมโยงในการสร้างการตรวจแก้จุดบกพร่องของไลบรารีเท่านั้น (ตัวแปรในไลบรารีดังกล่าวสิ้นสุดด้วยการมี ') การใช้คุณลักษณะเหล่านี้ในโปรแกรมประยุกต์ที่คุณเขียน หรือในชั้นเรียนคุณออกแบบจะมากพัฒนาทั้ง runtime และดักจับข้อผิดพลาดในเวลาคอมไพล์ของโปรแกรมประยุกต์ของคุณ ฟังก์ชันเหล่านี้จะอธิบายไว้ด้านล่าง แต่ทั้งหมดจะรวมอยู่ในคู่มืออ้างอิงไลบรารีของคลาส?
ทุกชั้นที่ได้รับมาจากCObjectใน MFC ใช้การถ่ายโอนข้อมูลสมาชิกฟังก์ชัน ซึ่งทำให้คุณสามารถดูสถานะของวัตถุในรูปแบบ ASCII ฟังก์ชันนี้สามารถถูกเรียกจากดีบักเกอร์ หรือวางไว้ภายใน #ifdef _DEBUG /#endif ส่วนของโค้ดของคุณ ผู้ช่วยเหลือฟังก์ชันAfxDumpจะรวมอยู่ในไลบรารีการตรวจแก้จุดบกพร่องเพียงเพื่อวัตถุประสงค์นี้ เรียกว่า มีหนึ่งพารามิเตอร์ CObject * คุณสามารถเรียกฟังก์ชันนี้จากดีบักเกอร์จะพิมพ์ออกเป็นอาร์กิวเมนต์ คุณควรใส่สมาชิกการถ่ายโอนข้อมูลสำหรับชั้นเรียนที่คุณใช้ กับ AssertValid คุณควรก่อนอย่างชัดเจนเรียกคลาสพื้นฐานของฟังก์ชันการถ่ายโอนข้อมูลสมาชิก ผลลัพธ์ของการถ่ายโอนข้อมูลถูกส่งไปมาตรฐาน MFC CDumpContext, afxDumpซึ่งตามค่าเริ่มต้นไปในหน้าต่างผลลัพธ์ดีบักเกอร์ หรือ การแก้จุดบกพร่องของเทอร์มินัล นอกจากนี้คุณยังสามารถใช้โปรแกรม DBWIN เพื่อดูการแสดงผลของafxDump แฟ้มมา MFC\SRC\DUMPINITCPP รวมถึงข้อมูลเกี่ยวกับวิธีการกำหนดเส้นทางafxDumpไปยังปลายทางอื่น?
สืบค้นกลับแมโครที่ทำงานมากชอบ printf เท่านั้นแสดงผลเส้นทางไปยังตำแหน่งafxDump คุณควรใช้การสืบค้นกลับคำสั่งเพื่อบ่งชี้สถานที่แพรวพราว หรือยอดเยี่ยมในรหัสของคุณ เป็นคุณลักษณะอื่น ๆ ความคึกคักสืบค้นกลับจะมีประโยชน์ในไลบรารีการตรวจแก้จุดบกพร่อง และไม่มีผลในการสร้างขายปลีก รี MFC รวมจำนวนมีอยู่แล้วภายในคำสั่งในการสืบค้นกลับสำหรับติดตามการไหลของข้อความ โปรดดู7 เทคนิคของหมายเหตุสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสืบค้นกลับการตรวจแก้จุดบกพร่อง?
ASSERTคือการตรวจสอบเวลาทำงานสำหรับความถูกต้องของคำสั่ง คุณควรใช้ASSERTs ตามอำเภอใจตลอดทั้งโปรแกรมของคุณ ตำแหน่งใด ๆ ที่คุณมีข้อคิดเห็นให้ผล:
/ / lpStr ควรเป็นค่า NULL ที่จุดนี้
คุณควรแทนที่ ด้วย assert เป็นเวลาทำงาน:
ASSERT(lpStr == NULL)
คอมไพล์เลอร์จะไม่สามารถทำความเข้าใจกับข้อคิดเห็น แต่มันสามารถประเมินนิพจน์ในแมโครที่ตรวจสอบเงื่อนไข ASSERTงบไม่มีผลต่อในสร้าง retails ถ้าคุณต้องการให้ข้อมูลจากASSERTในโครงสร้างการค้าปลีก แล้วใช้แมโครที่ตรวจสอบ?
MFC ยังรวมถึงการจัดสรรหน่วยความจำวินิจฉัยที่กว้างขวาง คุณสามารถใช้ตัวจัดสรรหน่วยความจำที่วินิจฉัยการตรวจสอบว่า คุณฟรีทรัพยากรหน่วยความจำทั้งหมดระหว่างฟังก์ชันบางโปรแกรม ตัวจัดสรรวินิจฉัยจะติดตามแฟ้มต้นฉบับและบรรทัดจำนวนของการปันส่วน ดังนั้นถ้าคุณใช้CMemoryState::DumpAllObjectsSince API คุณสามารถระบุตำแหน่งการปันส่วนที่ยังคงอยู่?
โดยค่าเริ่มต้น MFC จะถ่ายโอนข้อมูลวัตถุทั้งหมดที่ไม่รอด โดยโปรแกรมของคุณ (ถ้ามีอยู่ใด ๆ) ก่อนออกจากโปรแกรมของคุณ คุณสามารถดูผลลัพธ์นี้ได้ โดยการเรียกใช้โปรแกรมประยุกต์ของคุณภายใต้การดีบัก?
ตรวจสอบ Windows 3.1 ชนิดที่เข้มงวด
การตรวจสอบชนิดเคร่งครัดเป็นตัวเลือกที่พร้อมใช้งานกับ WINDOWSH ส่วนหัวของแฟ้ม MFC ใช้ชนิดเคร่งครัดเหล่านี้ตามค่าเริ่มต้น และคุณต้องใช้ถ้าคุณกำลังสร้างโปรแกรมประยุกต์ MFC MFC ไม่สนับสนุนการสร้างโปรแกรมประยุกต์ โดยไม่มี defintionsเคร่งครัด?
Typesafe การเชื่อม และเข้มงวด
ใน c ++ คุณจะอนุญาตให้มีฟังก์ชันหลายฟังก์ชัน ด้วยชื่อเดียวกัน ตราบใดที่ฟังก์ชันเหล่านี้มีรายการของพารามิเตอร์เป็นทางต่างกัน เพื่อให้มีเฉพาะการเชื่อมโยงสัญลักษณ์ c ++คอมไพเลอร์จะ "ติด" ชื่อเหล่านี้ใช้เป็นอัลกอริทึมที่อดข้อมูลเกี่ยวกับฟังก์ชันเช่นชื่อ หมายเลข และชนิดของพารามิเตอร์ทาง การเรียกประชุม ฯลฯ?
ชื่อที่สร้างขึ้นใหม่นี้ถูกใช้เป็นสัญลักษณ์เชื่อมโยงภายนอกสำหรับฟังก์ชัน นี้เรียกว่าการเชื่อม typesafe และเป็นประโยชน์สำคัญของ c ++ ตกแต่งชื่อนี้สามารถใช้ได้กับฟังก์ชันภายในบล็อกการ "C" extern และนั่นเป็นเหตุผลทั้งหมด APIs ใน WINDOWSH อยู่ในบล็อกเช่น?
ชนิดเคร่งครัดที่ตรวจสอบใน WINDOWSH ปรับปรุงความปลอดภัยสำหรับโปรแกรมของ Windows โดยใช้ชนิดที่แตกต่างกันเพื่อแสดงการจับที่แตกต่างกันทั้งหมดใน Windows ดังนั้นตัวอย่างเช่นเคร่งครัดจะป้องกันโดยผิดพลาดผ่านการHPENการรูทีนต้องการHBITMAP?
ตั้งแต่ APIs Windows อยู่ในบล็อก{} extern "C" พวกเขาจะไม่ตกแต่งในลักษณะที่อธิบายข้างต้น เคร่งครัดเปลี่ยนชนิดของการ typedefs Windows ต่าง ๆ เพื่อไม่ให้ซ้ำ (โดยเฉพาะจะใช้ชนิดต่าง ๆ ชี้เพื่อเป็นตัวแทนจัดการs ซึ่งไม่สามารถแปลงอย่างอิสระเป็น โดยไม่มีการนำแสดงโดยชัดเจน)?
เช่นที่คุณเห็น ถ้าคุณมีเคร่งครัดชนิดตรวจการเปิดใช้งาน ในแฟ้มหนึ่ง แต่ไม่ใช่ ในอีก c ++คอมไพเลอร์จะสร้างสัญลักษณ์การเชื่อมโยงภายนอกแตกต่างกันสำหรับฟังก์ชันเดียว นี้จะส่งผลในขณะที่การเชื่อมโยงข้อผิดพลาด ดังนั้น ขอแนะนำให้ คุณใช้ชนิดเคร่งครัดที่ตรวจสอบเฉพาะสำหรับโมดูล C (ที่จบในC) . นอกจากนี้เคร่งครัดเป็นเวลาคอมไพล์เป็นเพียงตัวเลือก ดังนั้นเมื่อคุณเสร็จเรียบร้อยแล้วคอมไพล์โค้ดของคุณ ประโยชน์ของเคร่งครัดจะรับรู้อย่างสมบูรณ์?
ถ้าคุณกำลังผสมเคร่งครัดและไม่ใช่-รหัสเคร่งครัดคุณต้องทราบการเชื่อมไม่สอดคล้องกัน ทั่วไป การเขียนโปรแกรม MFC ทั้งหมดและ c ++ทั้งหมดควรทำกับเคร่งครัด ถ้าคุณมีรหัส C แบบดั้งเดิม แล้ว ไม่ใช้เคร่งครัดจะยอมรับได้?
Windows 3.1 WINDOWSXH ส่วนหัวของแฟ้ม
ใหม่กับ Windows 3.1 และ Win32 ได้ WINDOWSXH ส่วนหัวของแฟ้มที่สนับสนุนส่วนขยายต่าง ๆ เป็นลักษณะการเขียนโค้ด C สำหรับโปรแกรมเมอร์ Windows ใช้ C. เหล่านี้แมโค APIs ขนมปังกรอบข้อความ และควบคุม APIs ถูกกำหนดในแฟ้ม WINDOWSXH?
ไวยากรณ์นี้ถูกออกแบบมาสำหรับโปรแกรมเมอร์ C เป็นหลัก MFC สนับสนุนการใช้ WINDOWSXH ดังนั้นถ้าคุณมีรหัสที่อยู่ที่อาศัย เหล่านี้ tensions ใช้รหัสนี้ unmodified ใน MFC คุณจะพบว่า อย่างไรก็ตาม MFC มีสำนวนที่เทียบเคียงสำหรับคุณลักษณะของ WINDOWSX ทั้งหมดH และภาษา c ++ใช้ในการทำงานเหล่านี้กับความปลอดภัยทางตรรก และสถาปัตยกรรมที่เพิ่มเติม?
การใช้ WINDOWSXH ให้แน่ใจว่า#รวมก่อนที่คุณได้รวม AFXWINH (หรือ STDAFXH ถ้าคุณกำลังใช้โครงสร้าง AppWizard)?
Caveat เดียวเท่านั้นคือมีสอง WINDOWSXH APIs ที่ชนกัน ด้วยการ APIs c ++ MFC APIs สองSubclassWindowและCopyRgnจะไม่พร้อมใช้งานสำหรับการใช้ภายใน MFC คุณจำเป็นต้อง recode เหล่านี้ไปใช้ทั้ง MFC API (และชั้นเรียน) หรือเรียก Windows API ได้โดยตรง นอกจากนี้คุณยังสามารถรหัสแมโครของคุณเองตราบใดที่มีชื่อแตกต่างกัน?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)