TN011: การใช้ MFC เป็นส่วนหนึ่งของ DLL

หมายเหตุนี้อธิบายปกติ 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)

Index