Pregunta

Es necesario abrir un archivo de ayuda HTML desde una aplicación de Windows legado escrito en versión antigua de C ++ Builder. HtmlHelp se carga a través HtmlHelp.ocx, que yo estoy cargando a través de LoadLibrary.

Esto ha funcionado bien durante años, pero ya no funciona en Windows 7 x64. También podría fallar bajo Windows 7 x86, pero no tengo cualquier computadora con este sistema operativo, por lo que no puede probarlo en el momento.

Estoy cargando hhctrl.ocx dinámica de la siguiente manera:

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

he comprobado si% SystemRoot% \ System32 \ hhctrl.ocx existe en el sistema Windows 7 y lo hace.

¿Por qué cargarlo a través de LoadLibrary fallar? ¿Cómo puedo solucionar este problema?

EDIT: dice GetLastError (en alemán, por lo que me acaba traduciendo): "No se pudo encontrar el archivo." Pero yo depurando la función y el camino es "% SystemRoot% \ System32 \ hhctrl.ocx" y el archivo no existe.

Además, dado que dos respuestas apuntan en la dirección de 64 bits vs problemas de 32 bits: Mi aplicación es un ejecutable de 32 bits compilado en C ++ Builder 5, por lo que debe ser un proceso de 32 bits, si no me equivoco. O soy un error suponer que?

¿Fue útil?

Solución

Utilice la función ExpandEnvironmentStrings para ampliar % SystemRoot% \ System32 \ hhctrl.ocx a la trayectoria real en intallation del usuario. SO de 64 bits redirigirá ruta ampliado para DLL de 32 bits correctamente.

Otros consejos

No se puede cargar DLL de 32 bits en un proceso de 64 bits, y viceversa. Los controles ActiveX son, por supuesto, DLLs.

A veces se puede evitar esto consiguiendo la 32 bits de ActiveX para cargar como un servidor fuera de proceso - su entonces alojado en una (o 64 bits) de 32 bits proceso separado, según corresponda. Esto requiere que el ActiveX onlyuses las interfaces del sistema ya sabe cómo calcular, y / o las versiones 64 y 32 bits integrada del proyecto de la DLL de proxy trozo.


Depende es una herramienta que es muy útil cuando se necesita averiguar por qué Dlls planteo carga. Por supuesto, como una aplicación de 32 bits en un sistema operativo de 64 bits que necesita saber que las aplicaciones de 32 bits no tienen acceso a %SYSTEMROOT%\System32 y, también no leer y escribir desde HKCR directamente. System32 en realidad contiene los binarios de 64 bits del sistema operativo, y HKCR contiene las entradas del registro para aplicaciones de 64 bits.

Un proceso de núcleo llamado 'reflexión' vuelve a dirigir aplicaciones de 32 bits completamente transparente a partir System32 a %SYSTEMROOT%\SysWow64. Del mismo modo, el acceso al registro de HKEY_CLASSES_ROOT se redirige a `HKEY_CLASSES_ROOT \ Wow6432Node'. Usted necesita saber esto, por supuesto, porque explorador y regedit son procesos de 64 bits y estará feliz de mostrar el contenido de 64 bits de System32 y HKCR. Que necesita para navegar de forma explícita a los nodos de 32 bits que vuelva a comprobar el punto de vista de su proceso de 32 bits se va a conseguir.

Tengo el mismo problema exacto en este momento corriendo W7 (64).

Yo tengo que trabajar cuando cambié el "% SystemRoot% \ System32 \ hhctrl.ocx" a "c: \ windows \ system32 \ hhctrl.ocx", pero supongo que necesito averiguar por qué resuelve% SystemRoot% equivocado.

BTW: Estoy construyendo una aplicación de 32 bits en BCB2007

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top