พารามิเตอร์ขนาดอนุญาตให้ไคลเอนต์ของนายทะเบียนระบุข้อมูลเวลาทำงาน การทำเช่นนี้ นายทะเบียนรักษาแผนที่แทนที่จะป้อนค่าเกี่ยวข้องกับพารามิเตอร์ไส้ในสคริปต์ของคุณ นายทะเบียนทำให้รายการเหล่านี้ในขณะใช้งาน ในส่วนต่อไปนี้แสดงขั้นตอนเหล่านี้?
ตัวช่วยสร้างวัตถุ ATL สร้างสคริปต์ที่ใช้ %MODULE% ATL ใช้พารามิเตอร์นี้ขนาดสำหรับตำแหน่งจริงของ DLL ของเซิร์ฟเวอร์ของคุณหรือ EXE?
นอกจากเพิ่ม %MODULE% ให้กับสคริปต์ ตัวช่วยสร้างวัตถุ ATL เพิ่มบรรทัดต่อไปนี้เพื่อประกาศคลาสของวัตถุ:
DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)
แมโครนี้ขยายการ:
คง hresult ใน WINAPI UpdateRegistry(BOOL bRegister)
{
nbsp กลับ _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bRegister);
}(&N)
ที่ _Module หมายถึงการส่วนกลางCComModuleซึ่งมีคำสั่งต่อไปนี้ของวิธีการและกำหนด#:
UpdateRegistryFromResource (UINT nResID, BOOL bRegister
nbsp struct _ATL_REGMAP_ENTRY * pMapEntries = NULL);
#กำหนด UpdateRegistryFromResource UpdateRegistryFromResource(&N)
วิธีการนี้เรียก AtlModuleUpdateRegistryFromResource ซึ่งประกอบด้วยรหัสต่อไปนี้:
ATLAPI AtlModuleUpdateRegistryFromResource(_ATL_MODULE*pM, nbsp; LPCOLESTR lpszRes, BOOL bRegister, struct _ATL_REGMAP_ENTRY * pMapEntries, IRegistrar * pReg)
{
USES_CONVERSION
...
CComPtr <IRegistrar> p
...
TCHAR szModule [_MAX_PATH];
GetModuleFileName (pM - > m_hInst, szModule, _MAX_PATH);
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule))
...
}
หมายเหตุnbsp คุณสามารถค้นหารหัสนี้ใน atl\include\atlimpl.cpp(&N)?
CoCreateInstance acquires ชี้ p ซึ่งชี้ไปนายทะเบียน AddReplacementได้รับการLPCOLESTRมีสายอักขระแล้ว " Module ", ตลอดจนการLPCOLESTRมีสายอักขระรับมาจากฟังก์ชัน Win32 API, GetModuleFileName รหัสนี้เพิ่มแทนแมปสำหรับความ Module ตัวแปรที่มีค่าเกี่ยวข้องกับผลลัพธ์ของGetModuleFileName ขณะนี้ เมื่อ preprocessor ที่เห็นการ %MODULE% ในสคริปต์ มันจะแทนมัน ด้วยค่าจากGetModuleFileName?
Preprocessor ที่อื่นใช้การ เชื่อมโยงข้อมูลเวลาทำงานกับข้อมูลสคริปต์ได้ ตัวอย่างเช่น สมมุติว่า เราต้องการให้รายการที่ประกอบด้วยเส้นทางแบบเต็มไปยังโมดูด้วยสายอักขระ " , 1 " ผนวกท้าย ครั้งแรก กำหนดขยายตัวต่อไปนี้:
'MyGoofyKey' = '%โมดูล% 1' s
แล้ว ก่อนการเรียกสคริปต์การประมวลผลวิธีหนึ่ง เพิ่มการแทนที่การแผนที่:
TCHAR szModule [_MAX_PATH]
GetModuleFileName (pM-gt; m_hInst, szModule, _MAX_PATH);
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule))
ในระหว่างการแยกของสคริปต์ นายทะเบียนขยาย '%MODULE%, 1' ไปc:\mycode\mydll.dll, 1?
หมายเหตุnbsp ในสคริปต์นายทะเบียน 4 K คือ ขนาดของโทเค็นสูงสุด (โทเค็นคือ องค์ประกอบใด ๆ รู้จักในไวยากรณ์) มีโทเค็นที่สร้าง หรือขยาย โดยการ preprocessor(&N)?
หมายเหตุnbsp การแทนค่าทดแทนเวลาเรียกใช้งาน เอาการเรียกไปยังDECLARE_REGISTRY_RESOURCEหรือDECLARE_REGISTRY_RESOURCEIDแมโคร แทน แทนที่ ด้วยฟังก์ชันของคุณเองสมาชิกUpdateRegistryที่เรียกCComModule::UpdateRegistryFromResourceและการส่งผ่านของอาร์เรย์ของโครงสร้างของ_ATL_REGMAP_ENTRY ของอาร์เรย์ของ_ATL_REGMAP_ENTRYต้องมีอย่างน้อยหนึ่งรายการที่ถูกตั้งค่าเป็น {NULL,NULL}, และรายการนี้ควรเป็นรายการสุดท้ายเสมอ มิฉะนั้น ข้อผิดพลาดการละเมิดการเข้าถึงจะถูกสร้างขึ้นเมื่อเรียกว่าUpdateRegistryFromResrouce(&N)?