الأسباب المحتملة لفشل تسجيل عنصر تحكم OLE

ملخص

OLE عناصر التحكم يمكن تسجيل باستخدام Visual c + + من القائمة "أدوات"، من "حاوية الاختبار" المتوفرة مع عنصر تحكم تطوير مجموعة أدوات (CDK)، أو باستخدام تطبيقات ريجسفر أو regsvr32 المتوفرة مع Visual c + +. في بعض الحالات، قد يفشل تسجيل عنصر التحكم; استخدم هذه المقالة للمساعدة على استكشاف أخطاء المشكلة وإصلاحها.

مزيد من المعلومات

تستخدم كافة الأساليب السالفة الذكر لتسجيل عنصر تحكم OLE بشكل أساسي بنفس الأسلوب. يتم استدعاء loadlibrary () لتحميل عنصر التحكم في الذاكرة ويتم استدعاء getprocaddress () للحصول على عنوان دالة DllRegisterServer() فيسمى DllRegisterServer() تسجيل عنصر التحكم.

أسباب لماذا قد يفشل تسجيل أحد عناصر التحكم

  • واحد أو أكثر من اللازم OLE DLLs غير موجود في المسار. يمكن العثور على إرشادات حول توزيع عناصر تحكم OLE بالإضافة إلى شرح لماذا DLLs ضرورية للشحن في الملف Shipctrl.wri الموجود في نفس الدليل ك CDK.
  • يتم تحميل عنصر التحكم DLL خلاف OLE DLL وذلك ال DLL غير موجود في المسار. عند تحميل عنصر التحكم في الذاكرة, يتم تحميل أي DLLs التي تم تحميلها ضمنياً من خلال مكتبة استيراد. إذا كان أي من هذه DLLs ليست في المسار، عنصر التحكم غير محمل بنجاح، حتى يفشل تسجيل.
  • قد يكون واحد أو أكثر من ملفات Dll إصدار خاطئ. إذا تم إنشاء عنصر التحكم باستخدام إصدار أحدث من ملف DLL من واحد مثبتاً على جهاز الكمبيوتر، قد لا يتم تحميل عنصر التحكم بشكل صحيح، حتى يفشل تسجيل.
  • إصدار قديم من Ocd25.lib مرتبطة ب. إذا كان عنصر التحكم يستخدم فئات قاعدة بيانات MFC، قد يكون هناك مشكلة مع إصدار الملف Ocd25.lib الذي تم ربطه إلى.
  • عنصر تحكم OLE موجود على محرك أقراص بعيد ملقم Novell. في هذه الحالة، حقوق الوصول إلى ملف.ocx قد يمنع عنصر التحكم من التحميل. تأكد من أن يتم تعيين حقوق الوصول لملف.ocx لوصول القراءة فقط "أو" قابل للمشاركة وهو الإعداد النموذجي للملفات القابلة للتنفيذ.

تقنيات استكشاف الأخطاء وإصلاحها

إذا تحققت أي من الأسباب المحتملة في حالة الخاصة بك، حاول الأساليب التالية.


  1. مع عنصر تحكم تحميل Visual c + +، تعيين الملف التنفيذي لجلسة عمل التصحيح إلى OLE عنصر تحكم حاوية الاختبار (Tstcon16.exe أو Tstcon32.exe). عند بدء تشغيل "حاوية الاختبار" (ضمن مصحح الأخطاء)، سوف تحصل على تحذير أن "حاوية الاختبار" لا يحتوي على معلومات التصحيح. تجاهل ذلك ومتابعتها.
  2. من "حاوية الاختبار"، حاول تسجيل عنصر التحكم. لمشاهدة إخراج التصحيح من DLL OLE التحكم أو أي من DLLs التابعة الخاصة به. إذا كنت تستخدم المنتجات ذات 16-بت، تذكر لتشغيل برنامج DBWIN لتلقي إخراج التصحيح.


    للحصول على معلومات حول كيفية تعيين الملف التنفيذي ل DLL تصحيح الدورة، انظر موضوع التعليمات "تصحيح الأخطاء DLLs" في كتب.
وكبديل لذلك، يمكنك محاولة تسجيل عنصر التحكم برمجياً. أولاً إنشاء تطبيق MFC AppWizard تحديد تطبيق يستند إلى الحوار والتنفيذ التلقائي OLE. سيتم تمكين التنفيذ التلقائي OLE إلى تهيئة OLE حتى تعمل التعليمات البرمجية لتسجيل عنصر التحكم بشكل صحيح. في الفئة المشتقة CWinApp، ستجد الدالة InitInstance() بالتعليمات البرمجية الأولى كما يلي:

BOOL CTestregApp::InitInstance(){

// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}

عند هذه النقطة، قم بإضافة مقطع التعليمات البرمجية التالية، التي تسمح لك بفحص رموز الإرجاع من loadlibrary () و getprocaddress () DllRegisterServer.

#ifdef _WIN32    HINSTANCE hDLL = LoadLibrary("some.ocx");
if(NULL == hDLL)
{
// See Winerror.h for explaination of error code.
DWORD error = GetLastError();
TRACE1("LoadLibrary() Failed with: %i\n", error);
return FALSE;
}

typedef HRESULT (CALLBACK *HCRET)(void);
HCRET lpfnDllRegisterServer;

lpfnDllRegisterServer =
(HCRET)GetProcAddress(hDLL, "DllRegisterServer");
if(NULL == lpfnDllRegisterServer)
{
// See Winerror.h for explaination of error code.
DWORD error = GetLastError();
TRACE1("GetProcAddress() Failed with %i\n", error);
return FALSE;
}

if(FAILED((*lpfnDllRegisterServer)()))
{
TRACE("DLLRegisterServer() Failed");
return FALSE;
}

#else // 16-bit
HINSTANCE hDLL = LoadLibrary("regtest.ocx");
if(HINSTANCE_ERROR > hDLL)
{
// See LoadLibrary() help for explaination of error code.
TRACE1("LoadLibrary() Failed with: %i\n", hDLL);
return FALSE;
}

typedef HRESULT (CALLBACK *HCRET)(void);
HCRET lpfnDllRegisterServer;

lpfnDllRegisterServer =
(HCRET)GetProcAddress(hDLL, "DllRegisterServer");
if(NULL == lpfnDllRegisterServer)
{
// See GetProcAddress() help for explaination of error code.
TRACE("GetProcAddress() Failed");
return FALSE;
}

if(FAILED((*lpfnDllRegisterServer)()))
{
TRACE("DLLRegisterServer() Failed");
return FALSE;
}
#endif

خصائص

رقم الموضوع: 140346 - آخر مراجعة: 12‏/01‏/2017 - المراجعة: 1

تعليقات