การแก้ไข: 1. การใช้ตัวติดตั้งเพื่อสร้างไฟล์แพ็คเกจมักจะเพิ่มขนาดของโปรแกรมเอง
มีสองวิธีในการใช้:
1. ใส่การควบคุม ActiveX Visual โดยตรงลงในโปรแกรม
2. รันไทม์ถูกจัดตั้งขึ้นตามเวลาจริงตามต้องการ
หากมีการใช้งานโดยตรงแอปพลิเคชันจะค้นหาและสร้างการควบคุม ActiveX ที่ต้องการโดยอัตโนมัติในระหว่างกระบวนการเริ่มต้น
เพิ่มวิธีการใหม่ในแบบฟอร์มโปรแกรม:
หน่วย UAUTOREGACTIONX;
ส่วนต่อประสาน
ใช้
Windows, ข้อความ, sysutils, ตัวแปร, คลาส, กราฟิก, การควบคุม, รูปแบบ, กล่องโต้ตอบ, comobj;
พิมพ์
tautoreGactivexfrm = คลาส (tform)
โพรซีเดอร์แบบฟอร์ม (ผู้ส่ง: tobject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
ได้รับการคุ้มครอง
{ประกาศสาธารณะ}
ขั้นตอน checkexception (ผู้ส่ง: tobject; EABORT: ข้อยกเว้น);
จบ;
วาจา
AutoreGactiveXFRM: tautoreGactivexfrm;
การดำเนินการ
{$ r *.dfm}
-
ในการควบคุม activeX มาตรฐานมีสองฟังก์ชั่น dllregisterserver และ dllunregisterserver ที่สามารถเรียกได้ซึ่งฟังก์ชั่นถูกใช้เพื่อลงทะเบียนการควบคุมและถอนการติดตั้งการควบคุม เราสามารถใช้ LoadLibrary เพื่อโหลดไฟล์ DLL/OCX ใช้ getProcaddress เพื่อรับพอยน์เตอร์ไปยัง dllRegistERServer และ dllunRegistERServer จากนั้นเรียกใช้ฟังก์ชั่นทั้งสองนี้โดยตรงเพื่อดำเนินการลงทะเบียนและถอนการควบคุม ActiveX ลงทะเบียนและถอนการติดตั้งการควบคุม
------------------------------------------------------ }
-
คำอธิบายพารามิเตอร์:
Solefilename ชื่อไฟล์ DLL หรือ OCX;
Oleaction ระบุประเภทการดำเนินการลงทะเบียน: 1 หมายถึงการลงทะเบียน 0 ระบุการถอนการติดตั้ง
ค่าส่งคืน: จริงหมายถึงการดำเนินการเสร็จสมบูรณ์เท็จหมายความว่าการดำเนินการจะล้มเหลว
------------------------------------------------------ }
ฟังก์ชั่น oleregister (solefilename: string; oleaction: byte): บูลีน;
const
registerole = 1;
Unregisterole = 0;
พิมพ์
toLeregisterFunction = ฟังก์ชั่น: HRESULT;
วาจา
Hlibraryhandle: Thandle;
hfunctionaddress: tfarproc;
regfunction: toleregisterfunction;
เริ่ม
ผลลัพธ์: = เท็จ;
// เปิดไฟล์และส่งคืนด้ามจับ DLL หรือ OCX
hlibraryhandle: = loadlibrary (pchar (solefilename));
ถ้า (hlibraryhandle> 0) แล้ว // dllakg ocx handle ถูกต้อง
พยายาม
// กลับไปที่ตัวชี้ฟังก์ชั่นการลงทะเบียนหรือถอนการติดตั้ง
if (leaaction = registerole) จากนั้น // ส่งคืนตัวชี้ฟังก์ชั่นที่ลงทะเบียน
hfunctionaddress: = getProcaddress (Hlibraryhandle, pchar ('' dllregisterserver '')))))))))))))))))
อื่น // ส่งคืนตัวชี้ฟังก์ชันถอนการติดตั้ง
HfunctionAddress: = getProcaddress (hlibraryhandle, pchar ('' dllunregisterserver ''));
ถ้า (hfunctionaddress <> nil) แล้ว // ตัดสินว่ามีฟังก์ชั่นการลงทะเบียนหรือถอนการติดตั้ง
เริ่ม
regfunction: = toLeregisterfunction (hfunctionaddress);
หาก regfunction> = 0 แล้ว // ดำเนินการลงทะเบียนหรือถอนการดำเนินการค่าคืนค่า> = 0 หมายถึงการดำเนินการสำเร็จ
/tresult: = true;
จบ;
ในที่สุด
FreeLibrary (Hlibraryhandle); // ปิดไฟล์ที่เปิด
จบ;
จบ;
{tautoreGactivexfrm}
ขั้นตอน tautoregactivexfrm.checkexception (ผู้ส่ง: tobject;
EABORT: ข้อยกเว้น);
เริ่ม
ถ้า EABORT เป็น EOLESYSERRO
เริ่ม
ถ้า hresult (eolesyserror (eAbort) .errorCode) = regdb_e_classnotreg แล้ว
oleregister ('' d:/flash.ocx '', 1);
จบ
อื่น
Application.ShowException (EABORT);
จบ;
// กำหนดวิธี Checkexception ให้กับตัวแปรแอปพลิเคชันระบบในเหตุการณ์ onCreate ของแบบฟอร์มหลัก
ขั้นตอน tautoregactivexfrm.formcreate (ผู้ส่ง: tobject);
วาจา
demoocx: ตัวแปร;
เริ่ม
application.onexception: = checkexception;
// ข้อผิดพลาดสตริงชื่อคลาสถูกสร้างขึ้นหรือไม่?
พยายาม
demoocx: = createOleobject ('' demo.demo '');
ยกเว้น
On Eabort: Eolesyserror ทำ
ถ้า hresult (eabort.errorCode) = co_e_classsstring แล้ว
เริ่ม
ถ้า oleregister ('' d: /flash.ocx '', 1) แล้ว
/tdemoocx: = createOleobject ('' demo.demo '')
อื่น
เริ่ม
/tapplication.messagebox(''Control การลงทะเบียนล้มเหลวโปรแกรมจะไม่ทำงานตามปกติ '', pchar ('การควบคุมการลงทะเบียน' '), mb_ok+mb_iconerror);
/tapplication.terminate;
จบ;
จบ;
จบ;
จบ;
จบ.