หมายเหตุนี้อธิบายวิธีที่คุณสามารถใช้ MFCxx.DLL และ (โดยที่ x คือ หมายเลขรุ่นของ MFC) MFCxxD.DLL ไลบรารีการเชื่อมโยงแบบไดนามิกที่ใช้ร่วมกันกับโปรแกรมประยุกต์ MFC และนามสกุล Dll ดูข้อมูลเพิ่มเติมเกี่ยวกับ Dll ปกติMFC ที่ใช้เป็นส่วนหนึ่งของ DLL?
หมายเหตุนี้ทางด้านเทคนิคครอบคลุมประเด็นที่สามของ Dll สุดท้ายทั้งสองมีสำหรับผู้ใช้ขั้นสูงเพิ่มเติม:
ถ้าคุณสนใจสร้าง DLL ใช้ MFC ที่สามารถใช้กับโปรแกรมประยุกต์ไม่ใช่ MFC (จะเรียกว่าปกติ DLL), โปรดดูเทคนิคหมายเหตุ 11?
ภาพรวมการสนับสนุน MFCxx.DLL: คำศัพท์และแฟ้ม
ปกติ DLL: คุณใช้ DLL ทั่วไปเพื่อสร้างแบบ DLL แบบสแตนด์อโลนที่ใช้บางคลาสที่ MFC อินเทอร์เฟซการข้ามขอบเขตของ App/DLL มีอินเทอร์เฟซ "C" และแอพลิเคชันไคลเอนต์ไม่จำเป็นต้องมีโปรแกรมประยุกต์ MFC?
นี่คือรุ่นของ DLL สนับสนุนที่ได้รับการสนับสนุนใน MFC 1.0 มีการอธิบายไว้ในด้านเทคนิคหมายเหตุ 11และตัวอย่างแนวคิดขั้นสูง MFC DLLTRACE?
หมายเหตุnbsp เป็นของ Visual c ++ เวอร์ชัน 4.0, USRDLLคำว่าล้าสมัย และได้ถูกแทนที่ โดยปกติ DLL ที่เชื่อมโยงคอนเพื่อ MFC นอกจากนี้คุณยังอาจสร้างปกติ DLL ที่เชื่อมโยงแบบไดนามิกเพื่อ MFC(&N)?
MFC 3.0 (และข้างต้น) สนับสนุน Dll ทั่วไป มีทั้งหมดที่ฟังก์ชันใหม่รวมถึงคลาสที่ OLE และฐานข้อมูล?
AFXDLL: นี้ยังถูกอ้างถึงเป็นรุ่นที่ใช้ร่วมกันของไลบรารี MFC นี่คือการสนับสนุน DLL ใหม่ที่เพิ่มเข้ามาใน MFC 2.0 ไลบรารี MFC เองคือในจำนวน Dll (อธิบายไว้ด้านล่าง) และแอพลิเคชันไคลเอนต์หรือ DLL ลิงค์แบบไดนามิก Dll ที่ต้องการ อินเทอร์เฟซการข้ามขอบเขตของโปรแกรม ประยุกต์/DLL มี C + +/ อินเทอร์เฟซของคลาส MFC แอพลิเคชันไคลเอนต์ต้องเป็นแอปพลิเคชันของ MFC สนับสนุนการทำงานทั้งหมดของ MFC 3.0 (excption: ไม่มีสนับสนุน UNICODE สำหรับระดับชั้นฐานข้อมูล)?
หมายเหตุnbsp เป็นของ Visual c ++ 4.0 รุ่น DLL ชนิดนี้เรียกว่า "นาม DLL(&N)
หมายเหตุนี้จะใช้ MFCxx.DLL เพื่ออ้างอิงทั้งหมดตั้ง MFC DLL ซึ่งประกอบด้วย:
หมายเหตุnbsp MFCSxx [U] [D]LIB ไลบรารีจะใช้ในการร่วมกับการ MFC Dll ที่ใช้ร่วมกัน ไลบรารีเหล่านี้ประกอบด้วยรหัสที่ต้องคอนลิงค์ไปยังโปรแกรมประยุกต์หรือ DLL(&N)?
การเชื่อมโยงโปรแกรมประยุกต์ไปยังไลบรารีการนำเข้าสอดคล้องกัน:
และ/การ "MFC นามสกุล DLL" เป็น DLL สร้างขึ้นจาก MFCxx.DLL (หรือ Dll ที่ใช้ร่วมกันอื่น MFC) ที่นี่สถาปัตยกรรมคอมโพเนนต์ MFC kicks ใน ถ้าคุณได้สืบทอดมาคลาสที่มีประโยชน์จากคลาส MFC การ หรือสร้างอื่นเหมือน MFC toolkit คุณสามารถใส่ลงใน DLL ที่ DLL ใช้ MFCxx.DLL เป็นไม่แอพลิเคชันไคลเอนต์ ultimate นี้ช่วยให้สามารถใบไม้ชั้น ชั้นฐานสามารถ และคลาสที่สามารถดู/เอกสาร?
หมายเหตุnbsp มันไม่จำเป็นต้องเชื่อมโยงกับการ MFCOxx [U] D, D MFCDxx [U] หรือ MFCNxx [U] D Debug ไลบรารีได้จนกว่าโปรแกรมประยุกต์ของคุณใช้การ MFC/OLE ฐานข้อมูล หรือระบบเครือข่ายชั้นตามลำดับ(&N)?
ข้อดีและข้อเสีย
ทำไมคุณควรใช้รุ่นที่ใช้ร่วมกันของ MFC?
ทำไมคุณไม่ควรใช้รุ่นที่ใช้ร่วมกันของ MFC:
DLL Extension MFC เป็น DLL ประกอบด้วยชั้นและฟังก์ชันในการเขียนการตบแต่งการทำงานของคลาสที่ MFC OLE และฐานข้อมูลการตรวจแก้จุดบกพร่องสนับสนุน Dll (MFCOxxD.DLL และ MFCDxxD.DLL) เป็นตัวอย่างของ MFC นามสกุล Dll ที่ใช้ MFCxxD.DLL DLL Extension MFC ใช้ Dll MFC ใช้ร่วมกันในลักษณะเดียวกันโปรแกรมประยุกต์ใช้ได้ มีข้อพิจารณาเพิ่มเติมบางอย่าง:
พิจารณาเหล่านี้ได้อธิบายไว้ในรายละเอียดด้านล่างนี้ คุณมาถึงตัวอย่างแนวคิดขั้นสูง MFC DLLHUSKเนื่องจากมันแสดงให้เห็น
ทั้งแอพลิเคชันไคลเอนต์และ Dll นามสกุลใด ๆ ต้องใช้ MFCxx.DLL รุ่นเดียวกัน คุณควรทำตามแบบแผนการของ MFC DLL และให้ทั้งสองดีบัก และ retail (/ ปล่อย) รุ่นของนามสกุล DLL นี้อนุญาตให้ไคลเอ็นต์โปรแกรมสร้างรุ่นทั้งขายปลีกและตรวจแก้จุดบกพร่องของโปรแกรมประยุกต์ของตน และเชื่อมโยงเข้ากับการตรวจแก้จุดบกพร่องที่เหมาะสมหรือ Dll ทุกรุ่นที่วางจำหน่าย?
หมายเหตุnbsp เนื่องจากการ c ++ชื่อ mangling และการส่งออก รายการส่งออกจากนามสกุล DLL อาจแตกต่างกันระหว่างรุ่นขายปลีกและการตรวจแก้จุดบกพร่องของ DLL เดียวกันและ Dll สำหรับสถาปัตยกรรมที่แตกต่างกัน ค้าปลีก MFCxx.DLL มีประมาณ 2000 ส่งรายการจุด การดีบัก MFCxxD.DLL มีประมาณ 3000 ส่งจุด(&N)?
หมายเหตุด่วนการจัดการหน่วยความจำ
ในส่วนที่ชื่อว่า "จัดการหน่วยความจำ ใกล้จุดสิ้นสุดของบันทึกย่อนี้ทางด้านเทคนิค อธิบายการใช้งาน MFCxx.DLL กับรุ่นที่ใช้ร่วมกันของ MFC ข้อมูลที่คุณต้องการทราบการใช้เพียงนามสกุล DLL อธิบายไว้ที่นี่?
MFCxx.DLL และทุกนามสกุล Dll โหลดลงในช่องว่างที่อยู่ของโปรแกรมประยุกต์แบบไคลเอ็นต์จะใช้ตัวจัดสรรหน่วยความจำเดียวกัน โหลดทรัพยากร และอเมริกาอื่น ๆ "ทั่วโลก" MFC เหมือนเป็นในแอพลิเคชันเดียวกัน นี้นั้นมีความสำคัญเนื่องจาก - MFC DLL ไลบรารีและปกติ Dll ที่เชื่อมโยง MFC คอนทำตรงกันข้ามแน่นอน และมีแต่ละปันส่วน DLL ของพูลหน่วยความจำของตนเอง?
ถ้านามสกุล DLL จัดสรรหน่วยความจำ จาก นั้นหน่วยความจำสามารถอิสระ intermix กับแอพลิเคชันจัดสรรวัตถุอื่น ยัง ถ้าโปรแกรมประยุกต์ที่ใช้ไลบรารี MFC ใช้ร่วมกันเกิดปัญหา การป้องกันของระบบปฏิบัติการจะรักษาความสมบูรณ์ของโปรแกรมอื่น ๆ MFC ประยุกต์ DLL ที่ใช้ร่วมกัน?
ในทำนองเดียวกัน อเมริกา MFC อื่น ๆ "ทั่วโลก" เหมือนกับแฟ้มปฏิบัติการได้ปัจจุบันโหลดทรัพยากรจาก ใช้ยังร่วมกันระหว่างแอปพลิเคชันของไคลเอนต์ และทั้งหมด MFC นามสกุล Dll ตลอดจน MFCxx.DLL เอง?
สร้างนามสกุล DLL
คุณสามารถใช้ AppWizard ในการสร้างโครงการ MFC นามสกุล DLL และมันจะสร้างโดยอัตโนมัติคอมไพเลอร์ที่เหมาะสมและการตั้งค่าตัวเชื่อมโยง มันยัง สร้างฟังก์ชันDllMainที่คุณสามารถปรับเปลี่ยน?
ถ้าคุณกำลังแปลงโครงการที่มีอยู่ไปเป็นนามสกุล MFC DLL เริ่มต้น ด้วยกฎมาตรฐานสำหรับการสร้างโปรแกรมประยุกต์ที่ใช้ MFC รุ่นที่ใช้ร่วมกันจาก นั้นให้ทำดังนี้:
การเปลี่ยนแปลงแฟ้มของหัวข้อ
เป้าหมายของนามสกุล DLL มักส่งออกทำงานบางอย่างที่พบโดยทั่วไปโปรแกรมประยุกต์อย่าง น้อยหนึ่งซึ่งสามารถใช้ฟังก์ชันการทำงานนั้น นี้ boils ลงเพื่อการส่งออกชั้นและฟังก์ชันส่วนกลางซึ่งพร้อมใช้งานสำหรับโปรแกรมประยุกต์ของไคลเอ็นต์?
เมื่อต้องการทำเช่นนี้ คุณต้องทำประกันว่า แต่ละฟังก์ชันของสมาชิกทำเครื่องหมายเป็นการนำเข้า หรือส่งออกได้ตามความเหมาะสม นี้ต้องประกาศพิเศษ: __declspec(dllexport)และ__declspec(dllimport) เมื่อเรียนของคุณจะถูกใช้ โดยโปรแกรมประยุกต์ของไคลเอ็นต์ คุณต้องการให้ถูกประกาศเป็น__declspec(dllimport) เมื่อนามสกุล DLL ตัวเองกำลังสร้าง พวกเขาควรถูกประกาศเป็น__declspec(dllexport) นอกจากนี้ ฟังก์ชันต้องจริงส่ง เพื่อให้โปรแกรมไคลเอ็นต์ผูกนั้นเวลาโหลด?
การส่งออกชั้นทั้งหมดของคุณ ใช้AFX_EXT_CLASSในข้อกำหนดของคลาส แมโครนี้ถูกกำหนด ด้วยกรอบเป็น__declspec(dllexport)เมื่อ_AFXDLLและ_AFXEXTถูกกำหนด แต่ถูกกำหนดเป็น__declspec(dllimport)เมื่อไม่มีกำหนด_AFXEXT _AFXEXTตามที่อธิบายไว้ข้างต้น เท่านั้นกำหนดเมื่ออาคารของนามสกุล DLL ตัวอย่างเช่น:
คลา AFX_EXT_CLASS CExampleExport: CObject สาธารณะ
{...คลานิยาม...}
การส่งออกชั้นทั้งหมดไม่
บางครั้งคุณอาจต้องการส่งออกเพียงแต่ละจำเป็นสมาชิกของคลาสของคุณ ตัวอย่างเช่น ถ้าคุณกำลังส่งออกเป็นCDialog-คลาส มาเท่านั้นคุณอาจต้องการส่งออกที่กำหนดและการเรียกDoModal คุณสามารถส่งสมาชิกเหล่านี้ใช้ของ DLLDEF แฟ้ม แต่คุณยังสามารถใช้AFX_EXT_CLASSในลักษณะเดียวกันในแต่ละสมาชิกที่คุณต้องการส่งออก?
ตัวอย่างเช่น:
คลา CExampleDialog: CDialog สาธารณะ
{
สาธารณะ:
nbsp AFX_EXT_CLASS CExampleDialog()
AFX_EXT_CLASS int DoModal()
/ / วางตัวของคำจำกัดความของคลาส
.
.
.
}(&N)
เมื่อคุณทำเช่นนี้ คุณอาจพบปัญหาการเพิ่มเติมเพราะว่า... คุณจะไม่ส่งสมาชิกทั้งหมดของชั้น ปัญหาอยู่ในวิธีการที่ทำงานของแมโครที่ MFC หลายของแมโคผู้ช่วยเหลือของ MFC ประกาศจริง หรือกำหนดข้อมูลสมาชิก ดังนั้น สมาชิกข้อมูลเหล่านี้จะต้องถูกส่งออกจาก DLL ของคุณ?
ตัวอย่างDECLARE_DYNAMICแมโครที่ถูกกำหนดดังเมื่อสร้างนามสกุล DLL:
#กำหนด DECLARE_DYNAMIC(class_name) \
ได้รับการป้องกัน: \
nbsp _GetBaseClass() CRuntimeClass * ปาสกาลคง \
สาธารณะ: \
คลา AFX_DATA CRuntimeClass คง ## class_name \
เสมือน CRuntimeClass * GetRuntimeClass() const \(&N)
บรรทัดที่เริ่ม " AFX_DATAคง" จะประกาศว่า วัตถุคงภายในของของคลาส การส่งออกชั้นนี้อย่างถูกต้อง และเข้าถึงข้อมูลขณะใช้งานจริงจากไคลเอนต์EXE คุณจำเป็นต้องส่งออกวัตถุนี้คง เนื่องจากวัตถุคงจะประกาศพร้อมตัวปรับแต่งAFX_DATAคุณต้องการกำหนดAFX_DATAเป็น__declspec(dllexport)เมื่ออาคาร DLL ของคุณ และกำหนดเป็น__declspec(dllimport)เมื่ออาคารปฏิบัติการไคลเอ็นต์?
ตามที่กล่าวไว้ข้างต้นAFX_EXT_CLASSถูกกำหนดไว้แล้วอย่างนี้ ดังนั้น คุณเพียงแค่ re-define AFX_DATAจะเหมือนกับAFX_EXT_CLASSรอบคำจำกัดความของคลาส?
ตัวอย่างเช่น:
nbsp #undef AFX_DATA
#กำหนด AFX_DATA AFX_EXT_CLASS
คลา CExampleView: CView สาธารณะ
{
DECLARE_DYNAMIC()
/ /...คลานิยาม...
};
#undef AFX_DATA
#กำหนด AFX_DATA(&N)
MFC มักใช้สัญลักษณ์AFX_DATAข้อมูลสินค้าที่จะกำหนดภายในของแมโคร เพื่อให้เทคนิคนี้จะทำงานสำหรับสถานการณ์ทั้งหมดดังนั้น ตัวอย่าง จะทำงานสำหรับDECLARE_MESSAGE_MAP?
หมายเหตุnbsp ถ้าคุณกำลังส่งออกชั้นทั้งหมดแทนที่จะเลือกสมาชิกของคลาส ข้อมูลแบบ static สมาชิกจะถูกส่งโดยอัตโนมัติ(&N)?
คุณสามารถใช้เทคนิคเดียวกันโดยอัตโนมัติส่งตัวดำเนินการแยกCArchiveเรียนที่ใช้แมโคDECLARE_SERIALและIMPLEMENT_SERIAL ส่งออกตัวดำเนินการเก็บถาวร โดย bracketing ที่ประกาศคลาส (อยู่ในนั้นแฟ้ม H) ด้วยรหัสต่อไปนี้:
#undef AFX_API
#กำหนด AFX_API AFX_EXT_CLASS
lt ประกาศคลาสของคุณที่นี่ >
#undef AFX_API
#กำหนด AFX_API
ข้อจำกัดของ _AFXEXT
คุณสามารถใช้สัญลักษณ์ pre-processorAFXEXT _สำหรับนามสกุล Dll ของคุณตราบใดที่คุณไม่มีนามสกุล Dll หลายชั้น ถ้าคุณมีนามสกุล Dll ซึ่งเรียก หรือสืบทอดมาจากชั้นในของนามสกุล Dll ซึ่งได้สืบทอดมาจากคลาสที่ MFC แล้ว คุณต้องใช้สัญลักษณ์ preprocessor ของคุณเองเพื่อหลีกเลี่ยงการโปรแกรม?
ปัญหาคือ ว่า ใน Win32 คุณต้องประกาศข้อมูลใด ๆ เป็น__declspec(dllexport)ถ้ามันจะถูกส่งจาก DLL และ__declspec(dllimport)ถ้าจะนำเข้ามาจาก DLL เมื่อคุณกำหนด_AFXEXT, MFC ส่วนหัวให้แน่ใจว่าที่AFX_EXT_CLASSกำหนดไว้อย่างถูกต้อง?
เมื่อคุณมีหลายชั้น สัญลักษณ์หนึ่งเช่นAFX_EXT_CLASSไม่เพียงพอ เนื่องจากนามสกุล DLL อาจถูกส่งออกชั้นใหม่ ตลอดจนการนำเข้าชั้นเรียนอื่น ๆ จากอีกนามสกุล DLL ในการที่จะจัดการกับปัญหานี้ ใช้สัญลักษณ์ pre-processor พิเศษซึ่งบ่งชี้ว่า คุณกำลังสร้าง DLL ตัวเองและใช้ DLL ตัวอย่างเช่น จินตนาการสองนามสกุล Dll, A.DLL และ B.DLL พวกเขาละส่งบางชั้นใน A.H และ B.H ตามลำดับ B.DLL ใช้คลาสที่จาก A.DLL ส่วนหัวของแฟ้มจะมีลักษณะดังนี้:
/ / A.H
#ifdef A_IMPL
nbsp #กำหนด CLASS_DECL_A __declspec(dllexport)
#อื่น
#กำหนด CLASS_DECL_A __declspec(dllimport)
#endif
คลา CLASS_DECL_A CExampleA: CObject สาธารณะ
{...คลานิยาม...};
/ / B.H
#ifdef B_IMPL
#กำหนด CLASS_DECL_B __declspec(dllexport)
#อื่น
#กำหนด CLASS_DECL_B __declspec(dllimport)
#endif
คลา CLASS_DECL_B CExampleB: CExampleA สาธารณะ
{...คลานิยาม... }(&N)
เมื่อ A.DLL ถูกสร้างขึ้น ได้สร้าง/D A_IMPLและเมื่อ B.DLL ถูกสร้างขึ้น ได้สร้าง/D B_IMPL โดยใช้สัญลักษณ์ที่แยกต่างหากสำหรับแต่ละ DLL ส่ง CExampleB และ CExampleA ถูกนำเข้ามาเมื่อสร้าง B.DLL CExampleA จะส่งออกเมื่ออาคาร A.DLL และนำเข้าเมื่อใช้ โดย B.DLL (หรือไคลเอนต์อื่น ๆ บาง)?
ไม่สามารถทำการ layering ชนิดนี้เมื่อใช้มีอยู่ภายในAFX_EXT_CLASSและ_AFXEXT pre-processor สัญลักษณ์ เทคนิคที่อธิบายข้างต้นแก้ปัญหานี้ในลักษณะไม่ unlike กลไก MFC เองใช้เมื่อสร้างส่วนของ OLE ฐานข้อมูล และเครือข่ายขยาย Dll?
การส่งออกชั้นทั้งหมดไม่
อีกครั้ง คุณจะต้องดำเนินการดูแลพิเศษเมื่อคุณกำลังส่งออกชั้นมีทั้งหมด คุณต้องแน่ใจว่า รายการของข้อมูลที่จำเป็นที่สร้างขึ้น โดยแมโค MFC จะถูกส่งออกได้อย่างถูกต้อง นี้สามารถทำ โดย re-defining AFX_DATAคลาสคุณเฉพาะแมโคร นี้ควรทำตลอดเวลาที่คุณกำลังส่งออกชั้นเรียนทั้งหมด?
ตัวอย่างเช่น:
/ / A.H
#ifdef A_IMPL
nbsp #กำหนด CLASS_DECL_A _declspec(dllexport)
#อื่น
#กำหนด CLASS_DECL_A _declspec(dllimport)
#endif
#undef AFX_DATA
#กำหนด AFX_DATA CLASS_DECL_A
คลา CExampleA: CObject สาธารณะ
{
DECLARE_DYNAMIC()
CLASS_DECL_A int SomeFunction()
//class นิยาม
.
.
};
#undef AFX_DATA
#กำหนด AFX_DATA(&N)
DllMain
ต่อไปนี้คือ รหัสแน่นอนที่คุณควรทำในแฟ้มแหล่งที่มาหลักสำหรับส่วนขยายของ DLL มาหลังจากที่มีมาตรฐาน โปรดสังเกตว่า เมื่อคุณใช้ AppWizard สร้างแฟ้มนามสกุล DLL starter ส่งแบบDllMainสำหรับคุณ?
#รวม "afxdllx.h"
คง AFX_EXTENSION_MODULE extensionDLL
int "C" extern APIENTRY DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
nbsp ถ้า (dwReason == DLL_PROCESS_ATTACH)
{
/ / เตรียมใช้งานแบบครั้งเดียวของนามสกุล DLL ถ้า (AfxInitExtensionModule (
extensionDLL, hInstance))
ส่งกลับค่า 0
/ / TODO: ทำงานเตรียมการใช้งานอื่น ๆ ที่นี่
}
else if (dwReason == DLL_PROCESS_DETACH)
{
/ / นามสกุล DLL ต่อกระบวนเลิกจ้าง
AfxTermExtensionModule(extensionDLL)
/ / TODO: ดำเนินงานการล้างข้อมูลอื่น ๆ ที่นี่
}
ส่งกลับค่า 1 / / ตกลง
}(&N)
การเรียกไปยังAfxInitExtensionModuleจับ runtime-ชั้นเรียนจากโมดูล (โครงสร้างCRuntimeClass ) รวมทั้งโรงของวัตถุ (วัตถุCOleObjectFactory ) สำหรับใช้ในภายหลังเมื่อมีสร้างวัตถุCDynLinkLibrary โทร (ตัวเลือก) เพื่อAfxTermExtensionModuleให้ MFC เพื่อล้างข้อมูลนามสกุล DLL เมื่อแต่ละกระบวนการแยกออก (ซึ่งเกิดขึ้น เมื่อออกจากกระบวนการ หรือ DLL ถูกยกเลิกการโหลดเป็นผลของการเรียกFreeLibrary ) จากนามสกุล DLL เนื่องจากส่วนใหญ่นามสกุล Dll ไม่รับโหลด (ปกติ พวกเขาถูกเชื่อมโยงผ่านไลบรารีของตนนำเข้า), การเรียกไปยังAfxTermExtensionModuleมักไม่จำเป็น?
ถ้าโหลดโปรแกรมประยุกต์ของคุณ และทำให้การนามสกุล Dll แบบไดนามิก ให้แน่ใจว่าการโทรAfxTermExtensionModuleเป็น above.nbsp แสดง นอกจากนี้ ให้แน่ใจว่าใช้AfxLoadLibraryและAfxFreeLibrary (แทนใช้ฟังก์ชัน Win32ระบุว่า LoadLibraryและFreeLibrary) ถ้าคุณประยุกต์ใช้หลาย ๆ กระทู้ การใช้AfxLoadLibraryและAfxFreeLibrary insures ที่รหัสเริ่มต้นและปิดระบบซึ่งดำเนินการเมื่อนามสกุล DLL เป็นการโหลด และไม่โหลด ไม่เสียหาย MFC รัฐส่วนกลาง(&N)?
แฟ้มหัว AFXDLLXH defintions พิเศษสำหรับใช้ในนามสกุล Dll เช่นข้อกำหนดสำหรับAFX_EXTENSION_MODULEและCDynLinkLibraryของโครงสร้างที่ประกอบด้วย?
ส่วนกลางextensionDLLต้องประกาศตามที่แสดง แตกต่างจากรุ่น 16 บิตของ MFC คุณสามารถจัดสรรหน่วยความจำ และเรียกใช้ฟังก์ชันต่าง ๆ ของ MFC ในช่วงเวลานี้ เนื่องจาก MFCxx.DLL เต็มได้ถูกเตรียมใช้งานตามเวลาเรียกว่าDllMainของคุณ?
ทรัพยากรที่ใช้ร่วมกันและเรียน
วิ MFC นามสกุล Dll เท่านั้นต้องส่งฟังก์ชันแบนด์วิธต่ำบางแอพลิเคชันไคลเอนต์และไม่มีอะไรเพิ่มเติม Dll เข้มข้นของอินเทอร์เฟซผู้ใช้เพิ่มเติมอาจต้องการส่งออกทรัพยากรและเรียน c ++ไปยังโปรแกรมประยุกต์ของไคลเอ็นต์?
การส่งออกทรัพยากรจะทำผ่านทางรายการทรัพยากร ในแต่ละโปรแกรมประยุกต์จะเป็นรายที่ถูกเชื่อมโยงรายการของวัตถุCDynLinkLibrary เมื่อค้นหาทรัพยากร ส่วนใหญ่ใช้งาน MFC มาตรฐานที่ว่า โหลดทรัพยากรไม่มองแรกที่โมดูทรัพยากรปัจจุบัน (AfxGetResourceHandle) และ ถ้าเดินไม่พบรายการของวัตถุCDynLinkLibraryพยายามโหลดทรัพยากรที่ร้องขอ?
สร้างแบบไดนามิกของ c ++วัตถุให้ชื่อคลาส c ++คล้ายคลึงกัน กลไกการ deserialization MFC วัตถุต้องมีวัตถุCRuntimeClassลงทะเบียนเพื่อให้มันสามารถสร้างใหม่ได้ ด้วยการสร้างแบบไดนามิก c ++วัตถุชนิดจำเป็นต้องยึดตามสิ่งที่ถูกเก็บไว้ก่อนหน้านี้ทั้งหมด?
ถ้าคุณต้องการให้แอปพลิเคชันไคลเอนต์ใช้ชั้นในของนามสกุล DLL ที่มีDECLARE_SERIALแล้วคุณจะต้องส่งออกชั้นเรียนของคุณจะสามารถมองเห็นแอพลิเคชันไคลเอนต์ นอกจากนี้ทำได้ โดยการเดินในรายการCDynLinkLibrary?
ในกรณีของตัวอย่างแนวคิดขั้นสูง MFC DLLHUSKรายการดูเหมือนกับ
สำนักงานใหญ่ - gt DLLHUSKEXE -หรือ - DLLHUSKEXE
| |
TESTDLL2DLL TESTDLL2DLL
| |
TESTDLL1DLL TESTDLL1DLL
| |
MFCO42DDLL |
| |
MFCD42DDLL |
| |
MFC42DDLL MFC42DLL(&G)
MFCxx.DLL การเป็นสุดท้ายมักจะอยู่กับทรัพยากรและรายการคลาสของ MFCxx.DLL รวมทั้งมาตรฐาน MFC ทรัพยากร รวมทั้งสตริพร้อมท์สำหรับรหัสคำสั่งมาตรฐานทั้งหมดด้วย วางไว้ที่หางของรายการให้ Dll และโปรแกรมไคลเอ็นต์ตัวเองจะไม่มีการคัดลอกตนเองมาตรฐาน MFC ทรัพยากร แต่การพึ่งทรัพยากรใช้ร่วมกันใน MFCxx.DLL แทน?
ผสานการทรัพยากรและคลาสชื่อของ Dll ทั้งหมดลงในช่องว่างชื่อของไคลเอ็นต์ของโปรแกรมประยุกต์มีข้อเสียที่คุณจำเป็นต้องระมัดระวังรหัสใดหรือชื่อที่คุณเลือก คุณสามารถปิดใช้งานคุณลักษณะนี้ โดยส่งทรัพยากรของคุณหรือวัตถุCDynLinkLibraryไปยังโปรแกรมประยุกต์ของไคลเอ็นต์ไม่แน่นอน DLLHUSKตัวอย่างจัดการพื้นที่ชื่อทรัพยากรที่ใช้ร่วมกัน โดยใช้หลายส่วนหัวของแฟ้ม ดู35 หมายเหตุทางเทคนิคเคล็ดลับเพิ่มเติมในการใช้แฟ้มทรัพยากรที่ใช้ร่วมกัน?
กำลังเตรียมใช้งาน DLL
ดังกล่าวข้างต้น คุณจะมักจะต้องการสร้างวัตถุที่CDynLinkLibraryเพื่อการส่งออกของทรัพยากรและการเรียนไปยังโปรแกรมประยุกต์ของไคลเอ็นต์ คุณจำเป็นต้องมีจุดส่งออกเริ่มต้น DLL Minimally นี้เป็นโมฆะรูทีนที่ใช้อาร์กิวเมนต์ไม่มี และไม่ส่งกลับค่า แต่อาจมีสิ่งใดที่คุณชอบ?
แต่ละโปรแกรมประยุกต์ของไคลเอ็นต์ที่อยากใช้ DLL ของคุณต้องเรียกรูทีนนี้เตรียมใช้งาน ถ้าคุณใช้วิธีนี้ คุณยังอาจจัดสรรวัตถุนี้CDynLinkLibraryในDllMainของคุณได้หลังจากโทรAfxInitExtensionModule?
ชุดคำสั่งการเตรียมใช้งานต้องสร้างวัตถุCDynLinkLibraryในโปรแกรมประยุกต์ของกอง แบบมีสายได้ถึงนามสกุลของคุณข้อมูล DLL ทำ มีดังนี้:
extern "C" extern โมฆะ WINAPI InitXxxDLL()
{
nbsp CDynLinkLibrary(extensionDLL) ใหม่
}(&N)
ชื่อประจำInitXxxDLLในตัวอย่างนี้ สามารถเป็นอะไรก็ต้อง ไม่จำเป็นต้องเป็น extern C แต่การทำเช่นนั้นทำให้ง่ายต่อการเก็บรักษารายการส่งออก?
หมายเหตุnbsp ถ้าคุณใช้นามสกุล DLL จาก DLL ปกติของคุณ คุณต้องส่งออกฟังก์ชันนี้เตรียมใช้งาน ฟังก์ชันนี้ต้องถูกเรียกจาก DLL ปกติก่อนที่จะใช้นามสกุล DLL ชั้นหรือทรัพยากรใด ๆ(&N)?
รายการที่ส่งออก
วิธีง่าย ๆ เพื่อการส่งออกชั้นเรียนของคุณคือการ ใช้__declspec(dllimport)และ__declspec(dllexport)ในแต่ละชั้นและฟังก์ชันที่คุณต้องการส่งออกทั่วโลก นี้ง่ายมาก แต่น้อยมีประสิทธิภาพมากกว่าการตั้งชื่อแต่ละจุดที่ (อธิบายไว้ด้านล่าง) เนื่องจากคุณสามารถควบคุมฟังก์ชันใดได้รับการส่งออกน้อยลงได้ และคุณไม่สามารถส่งออกฟังก์ชัน โดยแสดงอันดับนั้น นี่คือวิธีการที่ทั้ง TESTDLL1 และ TESTDLL2 ใช้การส่งรายการของตนเอง?
วิธีการที่มีประสิทธิภาพมากขึ้น (และวิธีการใช้ โดย MFCxx.DLL) คือการ ส่งออกแต่ละรายการด้วยตนเอง โดยการตั้งชื่อแต่ละรายการในนี้DEF แฟ้ม เนื่องจากเราจะส่งส่งออกงานจาก DLL ของเรา (ซึ่งก็คือ ไม่ทุก), เราต้องตัดสินใจว่า อินเทอร์เฟซที่เฉพาะที่เราต้องการส่งออก นี้เป็นเรื่องยากเนื่องจากคุณต้องระบุชื่อ mangled เพื่อที่ตัวเชื่อมโยงในรูปแบบของรายการในนี้DEF แฟ้ม ไม่ส่งเรียน c ++ใด ๆ เว้นแต่ว่าคุณจำเป็นต้องมีการเชื่อมโยงแบบสัญลักษณ์นั้นจริง ๆ?
ถ้าคุณพยายาม ส่งออก c ++เรียนกับDEF แฟ้มก่อน คุณอาจต้องการพัฒนาเครื่องมือเพื่อสร้างรายการนี้ได้โดยอัตโนมัติ นี้สามารถทำได้โดยใช้กระบวนการเชื่อมโยงระยะที่สองได้ เชื่อมโยง DLL ของคุณครั้งเดียว โดยไม่มีการส่งออก และอนุญาตให้มีตัวเชื่อมโยงเพื่อสร้างตัวแฟ้มสำหรับแมป ที่ได้สามารถใช้ในการสร้างรายชื่อของฟังก์ชันที่ควรถูกส่งออก เพื่อให้กับบาง munging สามารถใช้เพื่อสร้างรายการของคุณส่งออกสำหรับแฟ้มสำหรับแมปของคุณได้DEF แฟ้ม รายการส่งออกสำหรับ MFCxx.DLL และ OLE และฐานข้อมูลนามสกุล Dll หลาย thousand ในหมายเลข สร้างขึ้น ด้วยเช่นกระบวนการ (แม้ว่าจะไม่สมบูรณ์อัตโนมัติ และต้องใช้มือบางแต่งครั้งทุกชั่วขณะ)?
CWinApp vs. CDynLinkLibrary
DLL Extension MFC ไม่มีการCWinApp-มาวัตถุของตนเอง แต่ ต้องทำงานด้วยCWinApp-มาวัตถุของโปรแกรมประยุกต์ของไคลเอ็นต์ ซึ่งหมายความว่า เป็นว่า แอพลิเคชันไคลเอนต์เจ้าปั๊มข้อความหลัก การวนรอบที่ไม่ได้ใช้งานและ?
ถ้า DLL Extension ของ MFC ต้องรักษาข้อมูลพิเศษสำหรับแต่ละโปรแกรมประยุกต์ คุณสามารถสืบทอดมาชั้นใหม่จากCDynLinkLibraryและสร้างขึ้นใน InitXxxDLL รูทีนที่อธิบายข้างต้น เมื่อรัน DLL ที่สามารถตรวจสอบรายชื่อของโปรแกรมประยุกต์ปัจจุบันCDynLinkLibraryวัตถุเพื่อค้นหาสำหรับส่วนขยายที่เฉพาะ DLL?
การใช้ทรัพยากรในการใช้งานของคุณ DLL
ดังกล่าวข้างต้น โหลดทรัพยากรเริ่มต้นจะนำรายการของวัตถุCDynLinkLibraryหาแรก EXE หรือ DLL ที่มีทรัพยากรที่ร้องขอ APIs MFC ทั้งหมดรวมทั้งรหัสภายในทั้งหมดใช้AfxFindResourceHandleเพื่อเดินรายการทรัพยากรเพื่อค้นหาทรัพยากรใด ๆ ไม่ว่าที่มันอาจอยู่?
ถ้าคุณต้องการเพียง โหลดทรัพยากรจากสถานที่เฉพาะ ใช้ APIs AfxGetResourceHandleและAfxSetResourceHandleเพื่อทำบันทึกหมายเลขอ้างอิงที่เก่า และการตั้งค่าหมายเลขอ้างอิงใหม่ ให้แน่ใจว่าตัวจัดการทรัพยากรเก่าคืนค่าก่อนที่คุณสามารถกลับไปยังโปรแกรมประยุกต์ของไคลเอ็นต์ TESTDLL2 ตัวอย่างใช้วิธีการนี้สำหรับการโหลดเมนูอย่างชัดเจน?
เดินรายการมีข้อเสียที่ว่า มันจะช้ากว่าเล็กน้อย และต้องการจัดการทรัพยากร ID ช่วงนี้ มีข้อดีที่โปรแกรมประยุกต์แบบไคลเอ็นต์ที่เชื่อมโยงไปยังหลายนามสกุล Dll สามารถใช้ทรัพยากรใด ๆ DLL เตรียมไว้ได้ โดยไม่ต้องระบุหมายเลขอ้างอิงการอินสแตนซ์ DLL AfxFindResourceHandleคือ API ที่ใช้สำหรับการเดินรายการทรัพยากรต้องการค้นหาตรงตามที่กำหนด ใช้ชื่อและชนิดของทรัพยากร และการส่งกลับหมายเลขอ้างอิงทรัพยากรที่พบครั้งแรก (หรือค่า NULL)?
ข้อกำหนดของโปรแกรมประยุกต์
โปรแกรมประยุกต์ที่ใช้รุ่นที่ใช้ร่วมกันของ MFC ต้องปฏิบัติตามกฎง่าย ๆ ไม่กี่:
อาคารกับสภาพแวดล้อมการพัฒนา
ถ้าคุณกำลังใช้ makefile ภายในกับส่วนใหญ่เป็นค่าเริ่มต้นมาตรฐาน คุณสามารถเปลี่ยนโครงสร้างรุ่น DLL?
ขั้นตอนต่อไปนี้ถือว่า คุณมีโปรแกรมประยุกต์ MFC ที่ทำงานได้อย่างถูกต้องลิงค์กับ NAFXCWDLIB (สำหรับการตรวจแก้จุดบกพร่อง) และ NAFXCWLIB (สำหรับค้าปลีก) และคุณต้องการแปลงให้ใช้รุ่นที่ใช้ร่วมกันของไลบรารี MFC คุณกำลังเรียกใช้สภาพแวดล้อม Visual c ++ และมีแฟ้มภายในโครงการ?
อาคารกับ NMAKE
ถ้าคุณจะใช้คุณลักษณะ makefile ภายนอกของ Visual c ++ หรือจะใช้ NMAKE โดยตรง คุณจะต้องแก้ไข makefile ของคุณเพื่อสนับสนุนตัวเลือกตัวเชื่อมโยงและการคอมไพล์เลอร์
สถานะการคอมไพล์เลอร์ที่จำเป็น:
/ D_AFXDLL /MD
/ D_AFXDLL
ส่วนหัวของ MFC มาตรฐานสัญลักษณ์นี้จะกำหนดที่จำเป็น:
/MD
โปรแกรมประยุกต์ที่ต้องใช้ DLL รุ่นของไลบรารี C-runtime
ค่าสถานะการคอมไพล์เลอร์อื่น ๆ ทั้งหมดตามค่าเริ่มต้นของ MFC (ตัวอย่างเช่น _DEBUG สำหรับการดีบัก)?
แก้ไขตัวเชื่อมโยงรายการไลบรารี NAFXCWD การเปลี่ยนแปลงLIB เพื่อ MFCxxD.LIB และเปลี่ยน NAFXCWLIB เพื่อ MFCxx.LIB เพิ่ม MFCOxx[U]D.LIB, MFCDxx[U]D.LIB และ MFCNxx[U]D.LIB ตามความเหมาะสม (จำเป็นสำหรับกับใช้ของ MFC/OLE ฐานข้อมูล หรือระบบเครือข่ายชั้น) แทน LIBCLIB กับ MSVCRTLIB มีรารี MFC อื่นๆ ซึ่งเป็นสิ่งสำคัญที่ MFCxxD.LIB ถูกวางไว้ก่อนไลบรารี C-runtime?
เพิ่ม /D_AFXDLL ทั้งขายปลีกของคุณ และตัวเลือกคอมไพเลอร์ของทรัพยากร (อยู่ที่จริง compiles ทรัพยากรกับ /R) การตรวจแก้จุดบกพร่องหรือไม่ก็ ทำให้ปฏิบัติขั้นสุดท้ายของคุณมีขนาดเล็ก โดยใช้ทรัพยากรที่มีอยู่ใน Dll MFC?
สร้างเต็มรูปแบบถูกต้องหลังจากทำการเปลี่ยนแปลงเหล่านี้?
การสร้างตัวอย่าง
MFC ตัวอย่างโปรแกรมส่วนใหญ่สามารถสร้าง จาก Visual c ++ หรือ จากการ MAKEFILE NMAKE เข้าร่วมจากบรรทัดคำสั่ง?
การแปลงใด ๆ เหล่านี้ตัวอย่างการใช้ MFCxx.DLL คุณสามารถโหลดได้หมากเป็น Visual c ++ และแฟ้มการตั้งค่าตัวเลือกโครงการตามที่อธิบายไว้ข้างบน ถ้า คุณใช้ NMAKE build คุณสามารถระบุ " AFXDLL = 1 " บน NMAKE บรรทัดคำสั่งและที่จะสร้างตัวอย่างโดยใช้ไลบรารี MFC ใช้ร่วมกัน?
ตัวอย่างแนวคิดขั้นสูง MFC DLLHUSKอยู่กับ MFC รุ่น DLL ตัวอย่างนี้แสดงวิธีการสร้างโปรแกรมประยุกต์ที่เชื่อมโยงกับ MFCxx.DLL ไม่เท่านั้น แต่ยังแสดงคุณลักษณะอื่น ๆ ของตัวเลือก MFC DLL บรรจุภัณฑ์เช่น MFC นามสกุล Dll ที่อธิบายไว้ในหมายเหตุด้านเทคนิคนี้ในภายหลัง?
หมายเหตุการบรรจุภัณฑ์
รุ่นที่วางจำหน่ายของ Dll (MFCxx [U]DLL) เป็นอิสระ redistributable- รุ่นตรวจแก้จุดบกพร่องของ Dll ไม่ redistributable-อิสระ และควรใช้เฉพาะในระหว่างการพัฒนาโปรแกรมประยุกต์ของคุณ?
การดีบัก Dll ให้กับข้อมูลการตรวจแก้จุดบกพร่อง โดยใช้การดีบัก Visual c ++ คุณสามารถติดตามการทำงานของโปรแกรมประยุกต์ของคุณเช่นเดียวกับ DLL Dll ของ Release (MFCxx [U]DLL) ไม่ประกอบด้วยข้อมูลการตรวจแก้จุดบกพร่อง?
ถ้าคุณกำหนด หรือสร้างใหม่ใน Dll แล้วคุณควรเรียกเหล่านั้นบางสิ่งอื่นนอกเหนือจากแฟ้ม "MFCxx" The MFC SRC MFCDLLหมากอธิบายถึงตัวเลือกในการสร้าง และประกอบด้วยตรรกะสำหรับการเปลี่ยนชื่อ DLL กฎนี้ยังใช้กับ MFC/OLE ฐานข้อมูล และเครือข่าย Dll ซึ่งสร้างขึ้น โดย MFCOLEหมาก MFCDBหมาก และ MFCNETหมาก ตามลำดับ การเปลี่ยนชื่อแฟ้มเป็นสิ่งจำเป็น เนื่องจาก Dll เหล่านี้อาจใช้ร่วมกัน โดยโปรแกรมประยุกต์จำนวนมากของ MFC มี Dll MFC รุ่นแบบกำหนดเองของคุณแทนที่ติดตั้งบนระบบอาจแบ่งโปรแกรมประยุกต์ MFC อื่นที่ใช้ Dll MFC ใช้ร่วมกัน?
เกิดปัญหาขึ้นใน Dll MFC ไม่แนะนำ?
ในส่วนต่อไปนี้อธิบายวิธีการใช้งาน DLL MFC (MFCxx.DLL และ MFCxxD.DLL) รายละเอียดที่นี่จะยังไม่ทำความเข้าใจเกี่ยวกับสิ่งสำคัญถ้าคุณทั้งหมดต้องทำอย่างไรได้ใช้ MFC DLL กับโปรแกรมประยุกต์ของคุณ รายละเอียดที่นี่ไม่จำเป็นในการทำความเข้าใจกับวิธีการเขียนส่วนขยาย MFC DLL แต่ทำความเข้าใจเกี่ยวกับการใช้งานนี้อาจช่วยให้คุณเขียน DLL ของคุณเอง?
ภาพรวมการใช้งาน
MFC DLL ได้จริง ๆ DLL Extension MFC กรณีพิเศษตามที่อธิบายไว้ข้างต้น มีจำนวนการส่งออกสำหรับชั้นเรียนจำนวนมากมีขนาดใหญ่มาก มีบางอย่างเพิ่มเติมสิ่งที่เราทำใน MFC DLL ที่ทำพิเศษยิ่งกว่าปกตินามสกุล DLL?
Win32 ไม่มากที่สุดของงาน
MFC รุ่น 16 บิตจำเป็นต้องใช้เทคนิคพิเศษรวมทั้งต่อโปรแกรมประยุกต์ข้อมูลบนสแตกเซ็กเมนต์ เซ็กเมนต์พิเศษที่สร้างขึ้น โดยบางรหัสแอสเซมบลี 80 x 86 ข้อยกเว้นต่อกระบวนบริบท และเทคนิคอื่น ๆ จำนวนหนึ่ง Win32 โดยตรงสนับสนุนต่อการประมวลผลข้อมูลใน DLL ซึ่งเป็นสิ่งที่คุณต้องส่วนใหญ่ ส่วนใหญ่ MFCxx.DLL เป็นเพียง NAFXCWLIB บรรจุใน DLL ถ้าคุณดูโค้ดต้นฉบับ MFC คุณจะพบน้อยมาก #ifdef _AFXDLL เนื่องจากมีกรณีพิเศษจำนวนน้อยมากที่ต้องทำการ กรณีพิเศษที่มีอยู่โดยเฉพาะกระดูก Win32 บน Windows 3.1 (หรือที่เรียกกันเป็น Win32s) Win32s ไม่สนับสนุนต่อกระบวน DLL ข้อมูลโดยตรงดังนั้น MFC DLL ต้องใช้เก็บข้อมูลภายในเธรด (TLS) Win32 APIs เพื่อขอรับข้อมูลเฉพาะของกระบวนการ?
ผลกระทบในไลบรารีแหล่ง แฟ้มเพิ่มเติม
ผลกระทบของรุ่น_AFXDLLปกติ MFC คลาสไลบรารีแหล่งและส่วนหัวค่อนข้างเล็กน้อยได้ ไม่มีแฟ้มรุ่นพิเศษ (AFXV_DLLH) รวมทั้งแฟ้มที่มีหัวข้อเพิ่มเติม (AFXDLL_H) รวมอยู่ ด้วย AFXWIN หลักส่วนหัวของ H AFXDLL_หัวข้อ H มีคลาCDynLinkLibraryและรายละเอียดอื่น ๆ ใช้งานของโปรแกรมประยุกต์ของ_AFXDLLและ MFC นามสกุล Dll AFXDLLXหัวข้อ H มีไว้สำหรับการสร้าง MFC นามสกุล Dll (ดูด้านบนเพื่อดูรายละเอียด)?
แหล่งข้อมูลทั่วไปในไลบรารี MFC MFC SRC มีรหัสเงื่อนไขบางอย่างเพิ่มเติมภายใต้การ #ifdef _AFXDLL เป็นแหล่งเพิ่มเติมแฟ้ม (DLLINITCPP) ประกอบด้วยการเตรียมใช้งานโค้ดพิเศษของ DLL และรุ่นที่ใช้ร่วมกันของ MFC กาวอื่น ๆ?
เมื่อต้องการสร้างรุ่นที่ใช้ร่วมกันของ MFC แฟ้มเพิ่มเติมให้ (ดูด้านล่างสำหรับรายละเอียดเกี่ยวกับวิธีการสร้าง DLL)
อาคาร MFC DLL
เกิดปัญหาขึ้น MFC DLL ยากโดยเจตนา ดังนั้น คุณคิดว่า สอง (หรือสามเวลา) ก่อนที่จะทำมัน ถ้าคุณเข้าใจปัญหาอาจเกิดขึ้นของบรรจุภัณฑ์ และข้อจำกัดการกระจายที่อธิบายไว้ด้านล่าง และคุณ ยังจริงๆจำเป็นต้องสร้างใหม่ MFC DLL คุณสามารถ?
MFCDLLแฟ้มหมากจะสร้าง DLL Debug กับข้อมูล CodeView:
NMAKE /f mfcdll.mak DEBUG = 1 LIBNAME = MYMFC
MFCDLLแฟ้มหมากจะสร้าง DLL รุ่นโดยไม่ต้องแจ้งให้ทราบข้อมูล CodeView:
NMAKE /f mfcdll.mak DEBUG = 0 LIBNAME = MYMFC
(ในทำนองเดียวกัน คุณใช้ MFCOLEหมาก MFCDBหมาก และ MFCNETหมากเพื่อสร้าง MFCOxxD.DLL, MFCDxxD.DLL และ MFCNxxD.DLL - Dll ซึ่งประกอบด้วย MFC/OLE ฐานข้อมูล และเครือข่ายชั้น)
นี้จะสร้าง DLL MFC ในไดเรกทอรี MFC SRC ด้วยมาตรฐาน MFCxx.DLL และ MFCxxD.DLL ชื่อรุ่นส่วนตัว คุณจะต้องคัดลอกแฟ้มไปยังตำแหน่งเหมาะสมบนเส้นทางของคุณไปใช้ Dll ตัวใหม่ MFCDLLนอกจากนี้หมาก makefile จะสร้างไลบรารีการนำเข้า (MFCxx.LIB และ MFCxxD.LIB) และวางไว้ในไดเรกทอรี MFC LIB มาตรฐาน นี้จะแทนไลบล่วง MFCxx.LIB และ MFCxxD.LIB รารี ดังนั้นโปรดระมัดระวัง?
ถ้าคุณต้องการแจกจ่ายในไลบรารี MFC DLL รุ่นแก้ไข โปรดแน่ใจเปลี่ยนชื่อของ DLL ใน MFCDLLMakefile หมากและทั้งสองDEF แฟ้ม ดู makefile MFCDLLหมากสำหรับข้อมูลเพิ่มเติม?
คุณอาจปรับเปลี่ยนไลบรารี และแจกจ่ายแบบขายปลีก (/ ปล่อย) ของไลบรารีของคุณปรับเปลี่ยนเฉพาะในกรณีที่คุณเปลี่ยนชื่อเป็นสิ่งอื่นนอกเหนือจาก MFCxx.DLL คุณอาจไม่สามารถกระจายการตรวจแก้จุดบกพร่องรุ่นใดดีที่ pre-built หรือกำหนดเองสร้างบัก DLL?
ข้อจำกัดเหล่านี้กระจายเป็นหลักเพื่อ หลีกเลี่ยงการ proliferation ของไม่อาจไวรัสประกอบด้วย DLLs. Ideally คุณควรไม่จำเป็นต้องสร้างใหม่ใน Dll และถ้าคุณแจกจ่ายโปรแกรมประยุกต์ของคุณ ด้วย MFCxx.DLL โซลูชันที่ให้มาพร้อมกับผลิตภัณฑ์ Visual c ++ คุณจะหลีกเลี่ยงปัญหามากสำหรับตัวคุณเองและผู้ใช้ของคุณ?
การจัดการหน่วยความจำ
โปรแกรมประยุกต์ที่ใช้ MFCxx.DLL ใช้จัดสรรหน่วยความจำแบบทั่วไปโดย MSVCRTxx.DLL, C-runtime DLL ที่ใช้ร่วมกัน ทั้งแอพลิเคชัน Dll ใด ๆ ส่วนขยาย ตลอดจน Dll ของ MFC เองใช้ตัวจัดสรรหน่วยความจำที่ใช้ร่วมกันนี้ โดยใช้ DLL ที่ใช้ร่วมกันสำหรับการจัดสรรหน่วยความจำ Dll MFC สามารถระบุหน่วยความจำซึ่งภายหลังได้รอด โดยแอพลิเคชันหรือในทางกลับกัน เนื่องจากทั้งแอพลิเคชันและ DLL ต้องใช้ตัวจัดสรรเดียวกัน คุณควรไม่แทน c ++สากลดำเนินการใหม่หรือตัวดำเนินลบ กฎเดียวกันนำไปใช้กับส่วนเหลือของงานการจัดสรรหน่วยความจำ-C runtime (เช่น malloc, realloc ฟรี ฯลฯ)?
ปรับเลขแสดงอันดับ และคลา __declspec(dllexport) และตั้งชื่อ DLL
เราไม่ได้ใช้ class __declspec(dllexport)การทำงานของคอมไพเลอร์ c ++ แทน รายการส่งออกที่มีอยู่ในแหล่งไลบรารีคลาส (MFCxx.DEF และ MFCxxD.DEF) เฉพาะเหล่านี้เลือกชุดของจุด (ฟังก์ชันและข้อมูล) จะถูกส่งออก สัญลักษณ์อื่น ๆ เช่น MFC ฟังก์ชันการใช้งานส่วนตัวหรือคลาสของ จะไม่ถูกส่งออกดำเนินการส่งออกทั้งหมด โดยแสดงอันดับโดยชื่อสตริงในตารางการพำนัก หรือไม่เก็บชื่อ ?
การใช้ class __declspec(dllexport)อาจจะเป็นทางเลือกที่วางอนาคตสำหรับอาคารขนาดเล็ก Dll แต่ในกรณีของ DLL ขนาดใหญ่เช่น MFC กลไกการส่งออกเริ่มต้นมีประสิทธิภาพและผลิตจำกัด ?
หมายความว่าทั้งหมดนี้คืออะไร ที่เราสามารถบรรจุฟังก์ชันการทำงานกับรุ่น MFCxx.DLL ที่มีเพียงประมาณ 800 กิโลไบต์โดยไม่ลดทอนเสน่ห์ของการทำงานมาก หรือความเร็วในการโหลด จำนวนมาก MFCxx.DLL จะได้รับมีขนาดใหญ่กว่า 100 K เทคนิคนี้ไม่ได้ใช้งานนี้ยังทำได้เมื่อต้องการเพิ่มรายการเพิ่มเติมจุดที่ส่วนท้ายของอยู่DEF แฟ้มเพื่ออนุญาตให้มีการกำหนดรุ่นธรรมดาโดยไม่ลดทอนเสน่ห์ของประสิทธิภาพความเร็วและขนาดของการส่งออกโดยแสดงอันดับ ตรวจทานแก้ไขรุ่นหลักในไลบรารีคลาส MFC จะเปลี่ยนชื่อไลบรารี กล่าวคือ MFC30DLL เป็น DLL redistributable-ประกอบด้วยไลบรารี MFC คลาสรุ่น 3.0 การปรับรุ่นของ DLL นี้ พูด ใน 3.1 MFC สมมุติ DLL จะใช้ชื่อ MFC31DLL แทน อีกครั้ง ถ้าคุณปรับเปลี่ยนโค้ดต้นฉบับ MFC ผลิตรุ่นแบบกำหนดเองของ MFC DLL กรุณาใช้ชื่ออื่น (และถ้าไม่มี "MFC") ในชื่อ?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)