Frage

Ich brauche eine HTML-Hilfedatei öffnen aus einer Legacy-Windows-Anwendung geschrieben in alter Version von C ++ Builder. Htmlhelp wird über HtmlHelp.ocx geladen, die ich Laden bin über Loadlibrary.

Dies ist seit Jahren hat gut funktioniert, aber es funktioniert nicht mehr in Windows 7 x64. Es könnte auch unter Windows7 x86 scheitern, aber ich habe keinen Computer mit diesem Betriebssystem, so dass ich es nicht aus im Moment versuchen.

Ich lade hhctrl.ocx dynamisch wie folgt:

#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;
}

ich geprüft, ob% SystemRoot% \ System32 \ hhctrl.ocx existiert auf dem Windows 7-System und es funktioniert.

Warum es über Loadlibrary fail nicht geladen? Wie kann ich dieses Problem umgehen?

EDIT: , sagt GetLastError (in deutscher Sprache, so dass ich bin nur zu übersetzen): "Datei kann nicht finden." Aber ich gedebuggt die Funktion und der Pfad ist „% SystemRoot% \ System32 \ hhctrl.ocx“ und die Datei nicht existiert.

Da auch zwei Antworten in Richtung 64-Bit-vs 32-Bit-Probleme hinweisen: Meine Anwendung ist eine 32-Bit-ausführbare Datei in C ++ Builder 5 zusammengestellt, so dass es ein 32-Bit-Prozess sein sollte, wenn ich mich nicht irre. Oder bin ich falsch anzunehmen, dass?

War es hilfreich?

Lösung

Verwenden Sie Expand Funktion zu erweitern % SystemRoot% \ System32 \ hhctrl.ocx realen Pfad auf Benutzer intallation. 64-Bit-OS Pfad zu 32bit erweitert werden Redirect dll richtig.

Andere Tipps

Sie können nicht 32-Bit-DLLs in einem 64-Bit-Prozess geladen werden, und umgekehrt. ActiveX-Steuerelemente sind, natürlich, Dlls.

Sie können manchmal umgehen dies, indem Sie die 32-Bit-ActiveX immer zu Last als Out-of-Process-Server - sein dann in einem separaten 32-Bit (oder 64-Bit) Prozess als angemessen gehostet. Dies erfordert, dass das ActiveX-Schnittstellen des Systems onlyuses bereits weiß, wie man Marschall, und / oder das Projekt 64bit und 32bit Versionen des Proxy-Stub-DLL gebaut.


Hängt ein Werkzeug, das sehr nützlich ist, wenn Sie brauchen, warum Dlls gewohnt Last herauszufinden. Natürlich, als 32-Bit-Anwendung auf einem 64-Bit-OS müssen Sie wissen, dass 32-Bit-Anwendungen erhalten keinen Zugriff auf %SYSTEMROOT%\System32 und auch nicht direkt lesen und schreiben von HKCR. System32 tatsächlich enthält die 64-Bit-OS-Binärdateien und HKCR enthält die Registrierungseinträge für 64-Bit-Anwendungen.

Ein Kernel-Prozess ‚Reflexion‘ Umleitungen genannt 32bit vollständig transparent von System32 zu %SYSTEMROOT%\SysWow64 apps. Ebenso wird Zugriff auf die Registry zu HKEY_CLASSES_ROOT zu `HKEY_CLASSES_ROOT \ Wow6432Node‘ umgeleitet. Sie müssen dies natürlich wissen, weil Explorer und regedit 64-Bit-Prozesse und werden Sie glücklich die 64-Bit-Inhalt System32 und HKCR zeigen. Sie müssen sich auf die 32-Bit-Knoten zu überprüfen explizit navigate die Ansicht Ihr 32bit Prozess erhalten wird.

habe ich genau das gleiche Problem jetzt W7 (x64) ausgeführt wird.

Ich habe es an die Arbeit, wenn ich das "% SystemRoot% \ System32 \ hhctrl.ocx" auf "c: \ windows \ system32 \ hhctrl.ocx", aber ich denke, ich brauche, um herauszufinden, warum% SystemRoot% Entschlüssen falsch.

btw. Ich baue eine 32-Bit-Anwendung auf BCB2007

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top