سؤال

كنت بحاجة إلى فتح ملف تعليمات html من ضمن تركة تطبيق ويندوز مكتوب في النسخة القديمة من C++ Builder.HtmlHelp يتم تحميلها عبر HtmlHelp.ocx, وأنا التحميل عبر LoadLibrary.

وقد عملت بشكل جيد لسنوات لكنه لا يعمل بعد الآن في ويندوز 7 إلى x64.قد تفشل أيضا تحت Windows7 x86, ولكن ليس لدي أي جهاز كمبيوتر مع نظام التشغيل هذا, لذلك أنا لا يمكن أن تحاول ذلك في هذه اللحظة.

أنا تحميل hhctrl.ocx بشكل حيوي على النحو التالي:

#define HHPathRegKey "CLSID\\{adb880a6-d8ff-11cf-9377-00aa003b7a11}\\InprocServer32"

bool THTMLHelper::LoadHtmlHelp()
{
  HKEY HHKey;
  DWORD PathSize = 255;
  char Path[255];
  bool R = false;

  if (::RegOpenKeyExA(HKEY_CLASSES_ROOT, HHPathRegKey, 0, KEY_QUERY_VALUE, (void **)&HHKey) == ERROR_SUCCESS)
  {
    if (::RegQueryValueExA(HHKey, "", NULL, NULL, (LPBYTE)Path, &PathSize) == ERROR_SUCCESS)
    {
      //*****************************************
      //LOADING FAILS HERE
      //PATH IS %SystemRoot%\System32\hhctrl.ocx          
      //*****************************************
      HHLibrary = ::LoadLibrary(Path);
      if (HHLibrary != 0)
      {
        __HtmlHelp = (HTML_HELP_PROC) ::GetProcAddress(HHLibrary, "HtmlHelpA");
        R = (__HtmlHelp != NULL);
        if (!R)
        {
          ::FreeLibrary(HHLibrary);
          HHLibrary = 0;
        }
      }
    }
    ::RegCloseKey(HHKey);
  }
  return R;
}

راجعت إذا %SystemRoot%\System32\hhctrl.ocx موجود على نظام ويندوز 7 و يفعل.

لماذا التحميل عبر LoadLibrary تفشل ؟ كيف يمكن التغلب على هذه المشكلة ؟

تحرير: GetLastError يقول (في الألمانية ، لذلك أنا مجرد ترجمة):"لا يمكن العثور على الملف." لكن تصحيحه وظيفة المسار "%SystemRoot%\System32\hhctrl.ocx" و الملف موجود.

أيضا, منذ إجابتين نقطة في اتجاه 64 بت مقابل 32-بت المشاكل:طلبي هو 32 بت قابل للتنفيذ جمعت في C++ Builder 5 ، لذلك يجب أن تكون 32 بت العملية إذا لم أكن مخطئا.أو أنا من الخطأ أن نفترض ذلك ؟

هل كانت مفيدة؟

المحلول

استخدام ExpandEnvironmentStrings وظيفة لتوسيع %SystemRoot%\System32\hhctrl.ocx إلى المسار الحقيقي على المستخدم intallation.64bit OS سيتم توجيه توسيع الطريق إلى 32bit dll بشكل صحيح.

نصائح أخرى

لا يمكنك تحميل 32 بت dlls في 64bit العملية ، والعكس بالعكس.عناصر تحكم ActiveX هي ، بالطبع ، Dlls.

في بعض الأحيان يمكنك هذا عن طريق الحصول على 32bit ActiveX لتحميل من عملية الخادم لها ثم استضافت في فصل 32bit (أو 64bit) العملية المناسبة.وهذا يتطلب أن ActiveX onlyuses واجهات النظام يعرف بالفعل كيفية المشير ، و/أو بناء المشروع 64bit و 32bit versions الوكيل كعب dll.


يعتمد هو أداة مفيدة جدا عندما كنت بحاجة إلى معرفة لماذا دلس لن يتم تحميل.بالطبع 32 بت التطبيق على نظام التشغيل 64bit عليك أن تعرف أن 32 بت التطبيقات لا تحصل على الوصول إلى %SYSTEMROOT%\System32 و أيضا لا القراءة والكتابة من HKCR مباشرة.System32 في الواقع يحتوي على نظام التشغيل 64bit الثنائيات ، HKCR يحتوي على إدخالات التسجيل من أجل تطبيقات 64bit.

نواة عملية تسمى 'التفكير' الموجهات 32bit تطبيقات تماما بشفافية من System32 إلى %SYSTEMROOT%\SysWow64.وبالمثل ، سجل الوصول إلى HKEY_CLASSES_ROOT يتم إعادة توجيه إلى `HKEY_CLASSES_ROOT\Wow6432Node'.عليك أن تعرف هذا بالطبع لأن إكسبلورر regedit هي 64bit عمليات بسعادة تظهر لك 64bit محتويات System32 و HKCR.تحتاج إلى صراحة انتقل إلى 32bit العقد لمضاعفة التحقق من عرض 32bit العملية هو ذاهب للحصول على.

لدي نفس المشكلة الآن قيد التشغيل W7 (x64).

أنا حصلت على العمل عندما غيرت "%SystemRoot%\System32\hhctrl.ocx" إلى "c:\windows\System32\hhctrl.ocx" ولكن أعتقد أنني بحاجة إلى معرفة السبب في %SystemRoot% حل الخطأ.

راجع للشغل:أنا بناء 32bit التطبيق على BCB2007.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top