TN057: ปรับภาษาของคอมโพเนนต์ของ MFC

หมายเหตุนี้อธิบายบางอย่างของการออกแบบและขั้นตอนที่คุณสามารถใช้เพื่อทราบตำแหน่งของส่วนประกอบ ไม่ว่าจะเป็นโปรแกรมประยุกต์ หรือตัวควบคุม OLE หรือ DLL ที่ใช้ MFC?

ภาพรวม

จริง ๆ มีสองประเด็นการแก้ไขเมื่อ localizing คอมโพเนนต์ที่ใช้ MFC ครั้งแรกของทั้งหมด คุณต้องทราบตำแหน่งของทรัพยากร – สตริ กล่องโต้ตอบ และทรัพยากรอื่น ๆ ที่ระบุเฉพาะสำหรับคอมโพเนนต์ของคุณ คอมโพเนนต์ส่วนใหญ่ที่สร้างขึ้นโดยใช้ MFC ยังรวม และใช้หมายเลขของทรัพยากรที่ถูกกำหนด โดย MFC คุณต้องใส่ทรัพยากร MFC ถิ่นเช่นกัน โชคดี หลายภาษาเรียบร้อยแล้วให้ไว้ MFC เอง?

นอกจากนี้ ส่วนประกอบของคุณควรจะจัดเตรียมให้ทำงานในสภาพแวดล้อมของเป้าหมาย (ยุโรป หรือ DBCS เปิดใช้งานสภาพแวดล้อม) ส่วนใหญ่ นี้ขึ้นกับโปรแกรมประยุกต์ของคุณปฏิบัติอักขระ ด้วยการตั้งค่าบิตที่สูงอย่างถูกต้อง และการจัดการกับสายอักขระที่ มีอักขระไบต์คู่ MFC ถูกเปิดใช้งาน ตามค่าเริ่มต้น สำหรับสภาพแวดล้อมเหล่านี้ ทั้งสองที่เป็นไปได้เพื่อมีเดียว "โลกกว้าง" ไบนารีที่ใช้บนแพลตฟอร์มทั้งหมดกับทรัพยากรที่แตกต่างกันเพียงแค่เสียบเข้าที่เวลาเซ็ตอัพ?

Localizing ของคอมโพเนนต์ของทรัพยากร

Localizing DLL หรือโปรแกรมประยุกต์ของคุณควรเกี่ยวกับเพียงแทนทรัพยากร ด้วยทรัพยากรที่ตรงกับภาษาเป้าหมาย สำหรับแหล่งข้อมูลของคุณเอง นี่คือง่ายค่อนข้าง: แก้ไขทรัพยากรในตัวแก้ไขทรัพยากร และสร้างโปรแกรมประยุกต์ของคุณ ถ้าโค้ดของคุณเขียนได้อย่างถูกต้องจะมีสายหรือข้อความที่คุณต้องการทราบตำแหน่งล่วงลงในโค้ดต้นฉบับของคุณ c ++ – ไม่มีการปรับภาษาทั้งหมดสามารถทำ โดยเพียงแค่ปรับเปลี่ยนแหล่งข้อมูล ในความเป็นจริง คุณสามารถใช้คอมโพเนนต์ของคุณที่เกี่ยวข้องทั้งหมดให้เป็นรุ่นที่ถิ่นไม่แม้กับการสร้างรหัสต้นฉบับ นี้มีความซับซ้อนมากขึ้น แต่น่าจะดี และเป็นกลไกในการเลือก MFC ตัวเอง คุณจะยังสามารถทราบตำแหน่งโปรแกรมประยุกต์ โดยโหลดไฟล์ EXE หรือ DLL ลงในตัวแก้ไขทรัพยากร และการแก้ไขทรัพยากรโดยตรง ขณะนี้เป็นไปได้ มันต้อง re-application เหล่านั้นเปลี่ยนแปลงแต่ละครั้งที่คุณสร้างเวอร์ชันใหม่ของโปรแกรมประยุกต์ของคุณ?

วิธีหนึ่งที่จะหลีกเลี่ยงที่จะค้นหาทรัพยากรทั้งหมดใน DLL แยก บางครั้งเรียกว่าดาวเทียม DLL นี้คือแล้วโหลด DLL แบบไดนามิกขณะใช้งานจริง และทรัพยากรถูกโหลดจาก DLL นั้นแทนที่เป็นจากโมดูหลักกับโค้ดทั้งหมดของคุณ MFC สนับสนุนวิธีการนี้โดยตรง พิจารณาโปรแกรมประยุกต์ที่เรียกว่า MYAPPEXE มันสามารถได้ทั้งหมดของของทรัพยากรที่ตั้งอยู่ใน DLL เรียกว่า MYRESDLL ในโปรแกรมประยุกต์ของInitInstanceจะทำงานอย่างต่อไปนี้เพื่อโหลด DLL นั้น และ MFC โหลดทรัพยากรจากตำแหน่งที่ตั้งที่ทำให้เกิด:

CMyApp::InitInstance()
{
/ / หนึ่งของสิ่งแรกในรหัส init
HINSTANCE hInst = LoadLibrary("myres.dll")
ถ้า (hInst ! = NULL)
AfxSetResourceHandle(hInst)

/ / รหัสการเตรียมใช้งานอื่น ๆ จะทำตาม
.
.
.
}

จากในนั้น MFC จะโหลดทรัพยากรจาก DLL นั้นแทนที่เป็นจาก myapp.exe ทรัพยากรทั้งหมด อย่างไรก็ตาม ต้องมีอยู่ในที่ DLL – MFC จะไม่ค้นหาอินสแตนซ์ของโปรแกรมประยุกต์ในการค้นหาของทรัพยากรที่ระบุ เทคนิคนี้ใช้เท่า ๆ กันดีเป็นปกติ Dll ตลอดจนควบคุม OLE โปรแกรมติดตั้งของคุณต้องคัดลอกรุ่น MYRES เหมาะสมDLL ที่ขึ้นอยู่กับตำแหน่งที่ตั้งของทรัพยากรที่ผู้ใช้ต้องการ?

มันค่อนข้างง่ายเพื่อสร้างทรัพยากร DLL เท่านั้น คุณสร้างโครงการ DLL เพิ่มของคุณRC ได้ และแฟ้มเพิ่มทรัพยากรจำเป็น ถ้าคุณมีโครงการที่มีอยู่ที่ไม่ได้ใช้เทคนิคนี้ คุณสามารถคัดลอกทรัพยากรจากโครงการ หลังจากเพิ่มแฟ้มทรัพยากรในโครงการ คุณพร้อมเกือบจะสร้างโครงการ สิ่งเดียวที่คุณต้องทำคือ การตั้งค่าที่ตัวเชื่อมโยงตัวเลือกรวม/NOENTRY นี่บอกตัวเชื่อมโยงใน DLL ว่าไม่มีจุด – ตั้งแต่รหัสไม่มี มันไม่มีจุด?

หมายเหตุnbsp  ตัวแก้ไขทรัพยากร ใน Visual c ++ 4.0 และรุ่นที่ใหม่กว่าสนับสนุนหลายภาษาต่อแฟ้ม RC นี้สามารถทำให้ง่ายในการจัดการการปรับภาษาในโครงการเดียวกัน ทรัพยากรสำหรับแต่ละภาษาจะถูกควบคุม โดยไดเรกทีฟฐาน preprocessor ที่สร้างขึ้น โดยตัวแก้ไขทรัพยากร(&N)?

MFC ที่มีการใช้ทรัพยากรที่เฉพาะท้องถิ่น

โปรแกรมประยุกต์ MFC ใด ๆ ที่คุณสร้าง re-uses สองสิ่งจาก MFC: รหัสและทรัพยากร กล่าวคือ MFC มีข้อผิดพลาดต่าง ๆ กล่องโต้ตอบที่มีอยู่ภายใน และทรัพยากรอื่น ๆ ที่ใช้ โดยคลาสที่ MFC เพื่อให้ทราบตำแหน่งของโปรแกรมประยุกต์ทั้งหมด คุณจำเป็นต้องทราบตำแหน่งไม่เพียงแหล่งข้อมูลของโปรแกรมประยุกต์ของคุณ แต่ยังทรัพยากรที่เกิดขึ้นโดยตรงจาก MFC MFC แสดงหมายเลขของภาษาอื่นแฟ้มทรัพยากรโดยอัตโนมัติ ดังนั้นถ้าภาษาคุณกำลังกำหนดเป้าหมายเป็นหนึ่งในภาษาสนับสนุน MFC เรียบร้อยแล้ว คุณก็ต้องทำให้แน่ใจว่า คุณใช้ทรัพยากรถิ่นเหล่านั้น?

เช่นการเขียนนี้สนับสนุน MFC: จีน เยอรมัน สเปน ฝรั่งเศส อิตาลี ญี่ปุ่น และเกาหลี แฟ้มซึ่งประกอบด้วยรุ่นถิ่นเหล่านี้อยู่ใน MFC\INCLUDE\L.* ('L' ว่าสำหรับเฉพาะท้องถิ่น) ไดเรกทอรี แฟ้มภาษาเยอรมันได้ใน MFC\INCLUDE\L.DEU ตัวอย่าง เมื่อต้องการทำให้โปรแกรมประยุกต์ของคุณให้ใช้แฟ้มเหล่านี้ RC แทนที่แฟ้มที่อยู่ใน MFC\INCLUDE เพียงแค่เพิ่มเป็น /IC:\PROGRAM FILES\DEVSTUDIO\VC\MFC\INCLUDE\L.DEU กับบรรทัดคำสั่งของคุณ RC (นี้เป็นเพียงตัวอย่าง – คุณจะต้องทดแทนตำแหน่งที่ตั้งของคุณเลือกรวมทั้งไดเรกทอรีที่คุณติดตั้ง Visual c ++)?

คำแนะนำข้างต้นจะทำงานถ้าโปรแกรมประยุกต์ของคุณเชื่อมโยงคอนกับ MFC โปรแกรมประยุกต์ส่วนใหญ่เชื่อมโยงแบบไดนามิก (เนื่องจากที่เป็นค่าเริ่มต้น AppWizard) ในสถานการณ์สมมตินี้ ไม่เฉพาะรหัสเป็นแบบไดนามิกเพื่อเชื่อมโยง – มีทรัพยากร ผล คุณสามารถทราบตำแหน่งของทรัพยากรในโปรแกรมประยุกต์ของคุณ แต่ใช้งานทรัพยากร MFC จะยังคงสามารถโหลด จาก MFC4x.DLL (หรือรุ่นที่ใหม่กว่า) หรือ MFC4xLOC.DLL มีอยู่ คุณสามารถเข้าถึงนี้ได้จากมุมที่แตกต่างกันสอง?

คุณลักษณะเฉพาะใน Professional และ Enterprise Editionsnbsp  เชื่อมโยงกับ MFC คงถูกสนับสนุนเฉพาะใน Visual c ++ Professional และ Enterprise Editions ดูข้อมูลเพิ่มเติม Visual c ++ Editions(&N)?

วิธีการที่ซับซ้อนมากขึ้นคือการจัดส่งอย่างใดอย่างหนึ่ง MFC4xLOC.DLLs ถิ่น (เช่น MFC4xDEU สำหรับภาษาเยอรมัน MFC4xESP.DLL สำหรับภาษาสเปน ฯลฯ), หรือรุ่นที่ใหม่กว่า และติดตั้ง MFC4xLOC.DLL เหมาะสมลงในไดเรกทอรีระบบเมื่อผู้ใช้ทำการติดตั้งโปรแกรมประยุกต์ของคุณ นี้จะซับซ้อนมากสำหรับทั้งนักพัฒนาและผู้ใช้ และเช่นไม่แนะนำ ดู56 หมายเหตุทางเทคนิคสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคนี้และของ caveats?

วิธีการที่ง่ายที่สุด และปลอดภัยคือการ รวมทรัพยากร MFC ถิ่นใน DLL ตัวเอง (หรือดาวเทียมของ DLL) หรือโปรแกรมประยุกต์ของคุณถ้าคุณจะใช้อย่างใดอย่างหนึ่ง ปัญหาของการติดตั้ง MFC4xLOC.DLL ได้อย่างถูกต้องเพื่อ ทำอย่างไรเพื่อ คุณทำตามคำแนะนำเดียวกันสำหรับกรณีคงที่กำหนดข้างต้น (การตั้งค่าบรรทัดคำสั่ง RC ได้อย่างถูกต้องให้ชี้ไปที่ถิ่นทรัพยากร), ยกเว้นว่า คุณต้องเอาออก /D_AFXDLL กำหนดที่ถูกเพิ่ม โดย AppWizard เมื่อ /D_AFXDLL เป็นกำหนด AFXRESH (และแฟ้มอื่น ๆ MFC RC) ไม่จริงกำหนดทรัพยากรใด ๆ (เนื่องจากพวกเขาจะถูกดึงจาก Dll MFC แทน)?

หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)

Index