ใช้พารามิเตอร์ขนาด (Preprocessor ของนายทะเบียน)

พารามิเตอร์ขนาดอนุญาตให้ไคลเอนต์ของนายทะเบียนระบุข้อมูลเวลาทำงาน การทำเช่นนี้ นายทะเบียนรักษาแผนที่แทนที่จะป้อนค่าเกี่ยวข้องกับพารามิเตอร์ไส้ในสคริปต์ของคุณ นายทะเบียนทำให้รายการเหล่านี้ในขณะใช้งาน ในส่วนต่อไปนี้แสดงขั้นตอนเหล่านี้?

ใช้โมดูล%

ตัวช่วยสร้างวัตถุ 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?

Concatenating ข้อมูลเวลาทำงานกับข้อมูลของสคริปต์

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)?

Index