الحل 1. سيؤدي استخدام ملف التثبيت إلى زيادة حجم البرنامج نفسه.
هناك طريقتان لاستخدامه:
1. وضع التحكم في المرئي في البرنامج بشكل مباشر في البرنامج ؛
2. تم إنشاء وقت التشغيل في الوقت الحقيقي حسب الحاجة.
إذا تم استخدامه مباشرة ، فسيقوم التطبيق بالبحث تلقائيًا وإنشاء عنصر تحكم ActiveX المطلوب أثناء عملية التهيئة.
أضف طريقة جديدة إلى نموذج البرنامج:
وحدة uautoregactivex ؛
واجهة
يستخدم
Windows ، الرسائل ، sysutils ، المتغيرات ، الفئات ، الرسومات ، عناصر التحكم ، النماذج ، مربعات الحوار ، comobj ؛
يكتب
tautoRegactiveXFRM = فئة (tform)
Formcreate الإجراء (المرسل: TOBJECT) ؛
خاص
{إعلانات خاصة}
عام
{الإعلانات العامة}
محمية
{الإعلانات العامة}
الإجراء checkexception (المرسل: TOBJECT ؛ EABORT: استثناء) ؛
نهاية؛
var
AutoRegaCATIONXFRM: tautoRegactiveXFRM ؛
تطبيق
{$ r *.dfm}
{-------------------------------------------
في عناصر تحكم ActiveX القياسية ، هناك وظيفتان dllregisterserver و dllunregisterServer التي يمكن استدعاؤها ، حيث يتم استخدام الوظيفة لتسجيل عنصر التحكم وإلغاء تثبيت عنصر التحكم. يمكننا استخدام LoadLibrary لتحميل ملفات DLL/OCX ، واستخدام GetProcaddress للحصول على مؤشرات إلى dllregisterserver و dllunregisterver ، ثم قم بتشغيل هاتين وظيفتين مباشرة لتنفيذ عملية التسجيل وإلغاء تثبيت عناصر تحكم ActiveX ، وبالتالي استبدال نظام Windows REGSVR32.EXE لتنفيذ تنفيذ النشط تسجيل وإلغاء تثبيت التحكم.
------------------------------------------------- }
{-------------------------------------------
وصف المعلمة:
solefilename اسم ملف DLL أو OCX ؛
يشير OleAction إلى نوع عملية التسجيل: 1 يشير إلى التسجيل ، 0 يشير إلى إلغاء التثبيت
قيمة الإرجاع: TRUE تعني أن العملية يتم تنفيذها بنجاح ، تعني الخاطئة أن العملية قد فشلت
------------------------------------------------- }
وظيفة oleregister (solefilename: string ؛ oleaction: byte): boolean ؛
كونست
سجل = 1 ؛
Ungisterole = 0 ؛
يكتب
toleregisterfunction = الوظيفة: hresult ؛
var
HlibraryHandle: Thandle ؛
HfunctionAddress: TFARPROC ؛
regfunction: toleregisterfunction ؛
يبدأ
النتيجة: = خطأ ؛
// افتح الملف وأرجع مقبض DLL أو OCX
hlibraryHandle: = loadlibrary (pchar (solefilename)) ؛
إذا كان (hlibraryHandle> 0) ثم // dllakg ocx مقبض صحيح
يحاول
// العودة إلى مؤشر وظيفة التسجيل أو إلغاء التثبيت
إذا (OLEACTION = registerole) ثم إرجاع مؤشر الوظيفة المسجلة
hfunctionAddress: = getProcaddress (HlibraryHandle ، Pchar ('' 'dllregisterserver' ')))
آخر // إرجاع مؤشر وظيفة إلغاء التثبيت
hfunctionAddress: = getProcaddress (hlibraryHandle ، pchar ('' 'dllunregisterserver' ')) ؛
إذا كان (hfunctionAddress <> nil) ثم تحكم على ما إذا كانت وظيفة التسجيل أو إلغاء التثبيت موجودة
يبدأ
regfunction: = toleregisterfunction (hfunctionAddress) ؛
إذا كان RegfUnction> = 0 ثم // قم بتنفيذ عملية التسجيل أو إلغاء التثبيت ، فإن قيمة الإرجاع> = 0 تعني أن التنفيذ ناجح
/tresult: = صحيح ؛
نهاية؛
أخيراً
Freelibrary (HlibraryHandle) ؛
نهاية؛
نهاية؛
{tautoRegactiveXFRM}
الإجراءات tautoRegactivexfrm.Checkexception (المرسل: tobject ؛
eabort: استثناء) ؛
يبدأ
إذا كان eabort هو eolesyserror ثم
يبدأ
إذا كان hresult (eOlesySerror (eabort) .errorCode) = RegDB_E_ClassNotreg ثم
oleregister ('' d: /flash.ocx '' ، 1) ؛
نهاية
آخر
application.showException (eabort) ؛
نهاية؛
// تعيين طريقة checkexception إلى متغير تطبيق النظام في حدث onCreate للنموذج الرئيسي.
الإجراءات tautoRegactivexfrm.formCreate (المرسل: tobject) ؛
var
Demoocx: البديل
يبدأ
application.Onexception: = checkexception ؛
// هل تم إنشاء خطأ سلسلة اسم الفئة؟
يحاول
demoocx: = createOleObject ('' demo.demo '') ؛
يستثني
على eabort: eolesyserror تفعل
إذا كان hresult (eabort.errorcode) = co_e_classsstring ثم
يبدأ
إذا كان oleregister ('' d: /flash.ocx '' ، 1) ثم
/tdemoocx: = createOleBject ('' 'Demo.demo' ')
آخر
يبدأ
/فشل تسجيل /messagebox (''''''ccontrol التسجيل ، لن يتم تشغيل البرنامج بشكل طبيعي "، pCHAR ('' 'Control' ') ، mb_ok+mb_iconerror) ؛
/tapplication.TherT ؛
نهاية؛
نهاية؛
نهاية؛
نهاية؛
نهاية.