หมายเหตุนี้อธิบายปกติ Dll ซึ่งอนุญาตให้คุณใช้ไลบรารี MFC เป็นส่วนหนึ่งของ Windows dynamic-link library (DLL) จะถือว่า คุณคุ้นเคยกับ Windows Dll และวิธีการสร้างดังกล่าว ดูข้อมูลเกี่ยวกับ MFC นามสกุล Dll ซึ่งอนุญาตให้คุณสร้างส่วนขยายในไลบรารี MFC, DLL รุ่นของ MFC?
อินเทอร์เฟซ DLL
Dll ปกติถือว่า อินเทอร์เฟซระหว่างแอพลิเคชันและ DLL ระบุไว้ในฟังก์ชัน C เหมือนปกติหรือการเรียนส่งออกอย่างชัดเจน ไม่สามารถส่งออกอินเทอร์เฟซของคลาส MFC?
ถ้าทั้ง DLL และโปรแกรมประยุกต์ที่ต้องการใช้ MFC แล้วทั้งสองมีตัวเลือกการใช้ไลบรารี MFC รุ่นที่ใช้ร่วมกัน หรือมีสำเนาของไลบรารี MFC คอนลิงค์เข้าไป ในรุ่นก่อน Visual c ++ 4.0 ไลบรารีการเชื่อมโยงคง MFC ขึ้นแตกต่างกันสำหรับโปรแกรมประยุกต์และ Dll MFC โปรแกรมประยุกต์ และ DLL รุ่นปัจจุบันอาจทั้งสองใช้หนึ่งในรุ่นมาตรฐานของไลบรารี MFC ไม่มีไลบรารีแยกต่างหากสำหรับ Dll รุ่นนี้ (MFC ทำตัวเลือกขณะใช้งานจริง)?
Dll ปกติมีประโยชน์หลายอย่าง:
ข้อจำกัดของ API
ความสามารถบาง MFC จะไม่สามารถใช้ได้กับรุ่น DLL หนึ่งเนื่องจากข้อจำกัดทางเทคนิคหรือเนื่อง จากมักจะให้บริการเหล่านั้น โดยโปรแกรมประยุกต์ ข้อจำกัดเหล่านี้อยู่ด้านล่าง:
อาคาร DLL ของคุณ
เมื่อคอมไพล์ปกติ Dll ที่เชื่อมโยง MFC คอน สัญลักษณ์ "_USRDLL" และ "_WINDLL" ที่ต้องมีกำหนด รหัส DLL ของคุณยังต้องถูกคอมไพล์ ด้วยสวิตช์คอมไพเลอร์ดังต่อไปนี้:
เมื่อคอมไพล์ปกติ Dll ที่เชื่อมโยงแบบไดนามิกเพื่อ MFC คุณต้องกำหนดสัญลักษณ์ข้างต้น และใช้สวิตช์คอมไพเลอร์ข้างต้น Additonally, "_AFXDLL" สัญลักษณ์ต้องมีกำหนด และต้องถูกคอมไพล์รหัส DLL ของคุณด้วย:
Interface (Api) ระหว่างแอพลิเคชันและ DLL ต้องถูกส่งออกอย่างชัดเจน ขอแนะนำให้ คุณกำหนดอินเทอร์เฟซของคุณมี แบนด์วิดธ์ต่ำ ผสานการอินเตอร์เฟส C ที่เป็นไปได้ อินเทอร์เฟซ C โดยตรงได้ง่ายเพื่อรักษามากกว่า เรียน c ++ที่ซับซ้อนมากขึ้น?
วาง APIs ของคุณในหัวข้อการแยกต่างหากที่สามารถถูกรวม ด้วยแฟ้มทั้ง C และ c ++ (วิธีที่คุณจะไม่จำกัดลูกค้า DLL ของโปรแกรมเมอร์ c ++) ดูหัวข้อการ TRACEAPIH ในตัวอย่างแนวคิดขั้นสูง MFC DLLTRACEสำหรับตัวอย่างนี้ การส่งออกของฟังก์ชัน ป้อนรหัสในส่วนการส่งออกแฟ้มคำจำกัดความของโมดูล (DEF) หรือรวม__declspec(dllexport)ข้อกำหนดฟังก์ชันของคุณ ใช้__declspec(dllimport)เพื่อการนำฟังก์ชันเหล่านี้เข้าไปยังไคลเอนต์ปฏิบัติการได้?
คุณต้องเพิ่มแมโคAFX_MANAGE_STATEที่ระยะตั้งต้นทั้งหมดส่งออกฟังก์ชันใน Dll ปกติที่เชื่อมโยงแบบไดนามิกเพื่อ MFC เพื่อตั้งค่าสถานะปัจจุบันของโมดูลเป็นที่สำหรับ DLL ทำได้ โดยการเพิ่มบรรทัดต่อไปนี้ของรหัสเริ่มต้นของฟังก์ชันที่ส่งออกจาก DLL:
nbsp & nbsp;
AFX_MANAGE_STATE (AfxGetStaticModuleState ())
nbsp & nbsp;
WinMain - gt DllMain(&G)
ไลบรารี MFC กำหนดในมาตรฐาน Win32 DllMainจุดที่เริ่มต้นของวัตถุCWinAppได้รับเช่นในโปรแกรมประยุกต์ MFC แบบปกติ ทำการเตรียมใช้งานเฉพาะ DLL ทั้งหมดในฟังก์ชันInitInstanceสมาชิกในแอพลิเคชัน MFC ปกติ?
หมายเหตุที่กลไกCWinApp::Runไม่ใช้กับ DLL เนื่องจากโปรแกรมประยุกต์ที่เป็นเจ้าของปั๊มข้อความหลัก ถ้า DLL ของคุณแสดงขึ้นในกล่องโต้ตอบสร้าง หรือมีหน้าต่างเฟรมหลักของตนเอง ปั๊มข้อความหลักของโปรแกรมประยุกต์ของคุณต้องเรียกรูทีนที่ส่งออก DLL ที่เรียกCWinApp::PreTranslateMessage?
ดูตัวอย่าง DLLTRACE สำหรับใช้งานฟังก์ชันนี้?
ฟังก์ชันของ CWinApp ของคุณได้รับคลาสจะเรียกจาก MFC สมาชิกExitInstanceให้DllMainฟังก์ชัน DLL มีการยกเลิกการโหลด?
สิ่งที่ต้องทำการเชื่อมโยงทั้งหมดเข้าด้วยกัน
โดยปกติ Dll ที่เชื่อมโยง MFC คอน คุณต้องเชื่อมโยง DLL ของคุณกับไลบรารีนี้ (NAFXCWDLIB หรือ NAFXCWLIB) พร้อมกับรุ่นของ runtimes C ที่เรียกว่า ' LIBCMTLIB'. ไลบรารีเหล่านี้มี pre-built และอาจถูกติดตั้ง โดยการระบุเมื่อคุณเรียกใช้โปรแกรมติดตั้ง Visual c ++?
โค้ดตัวอย่าง
โปรดดูตัวอย่างโปรแกรมแนวคิดขั้นสูง MFC DLLTRACEสำหรับตัวอย่างสมบูรณ์ ซึ่งรวมถึง DLL ง่าย ๆ เรียกว่า ' ติดตามDLL' ที่ใช้โต้ตอบสถานะการติดตาม AFX (ดูเทคนิคหมายเหตุ 7) อีกทั้งยังมีโปรแกรมประยุกต์ HELLO อย่างง่ายที่เรียก DLL การใช้กล่องโต้ตอบ?
สิ่งที่น่าสนใจหลายให้สังเกต:
ดึงข้อมูลต่อไปนี้จาก TRACEAPIH แสดงสิ่งที่จำเป็นสำหรับ API หนึ่งที่กำหนดไว้ใน DLL ปกติคอนเชื่อมโยงไปยัง MFC:
#ifdef __cplusplus
extern "C" {
#endifnbsp / * __cplusplus * /
struct TracerData
{
BOOL bEnabled
ตั้งค่าสถานะ UINT
};
BOOL ไกลปาสกาลส่ง PromptTraceFlags (TracerData ไกล * lpData);
#ifdef __cplusplus
}
#endif(&N)
ในตัวอย่างนี้ มีใส่การประกาศในบล็อกการ '{} "C" extern' สำหรับผู้ใช้ c ++ ซึ่งมีประโยชน์หลายอย่าง ครั้งแรก มันทำให้ APIs DLL ของคุณใช้งาน โดยโปรแกรมประยุกต์ของไคลเอ็นต์ไม่ใช่ c ++ ประการที่สอง จะช่วยลดความค่าใช้จ่ายใน DLL เนื่องจาก c ++ชื่อ mangling จะไม่ใช้กับชื่อส่งออก ท้ายนี้ มันง่ายอย่างชัดเจนเพิ่มเป็นDEF ไฟล์ (สำหรับการส่งออกโดยแสดงอันดับ) โดยไม่ต้องกังวลเกี่ยวกับชื่อ mangling?
ฟังก์ชัน API ทั้งหมดคือ "ไกลการส่งออกของปาสกาล" แม้ไม่ stricly จำเป็นสำหรับ Win32 Dll ข้อกำหนดเหล่านี้ได้ถูกเก็บสำหรับ++:การสร้างง่ายหลังพอร์ตเป็น 16 บิต Windows ไกล PASCALและส่งออกแมทั้งหมดขยายไปยังไม่มีอะไรภายใต้ Win32?
โครงสร้างการใช้ API ได้รับมาจากคลาสที่ MFC และกำหนดไว้ทั้งหมดในหัวข้อการ API นี้ช่วยลดความซับซ้อนของอินเทอร์เฟซระหว่าง DLL และแอพลิเคชัน และ อีกครั้ง ทำ DLL ใช้งาน โดยโปรแกรม C ด้วย?
ตัวชี้ข้อมูลใด ๆ ใช้ใน API ได้ชัดเจนไกลตัวชี้ อีกไกลไม่จำเป็นจริง ๆ สำหรับ Win32 แต่เป็นประโยชน์ถ้าคุณวางแผนที่จะคอมไพล์รหัสสำหรับ Windows 16 บิตบางในอนาคต?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)