winapi - instalar - registrar ocx en windows 7 64 bits
LoadLibrary en el archivo OCX falla en Windows 7 x64 (3)
Necesito abrir un archivo de ayuda html desde una aplicación heredada de Windows escrita en la versión anterior de C ++ Builder. HtmlHelp se carga a través de HtmlHelp.ocx, que estoy cargando a través de LoadLibrary.
Esto funcionó bien durante años, pero ya no funciona en Windows 7 x64. También puede fallar en Windows7 x86, pero no tengo ninguna computadora con este sistema operativo, por lo que no puedo probarlo en este momento.
Estoy cargando hhctrl.ocx dinámicamente 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;
}
Comprobé si% SystemRoot% / System32 / hhctrl.ocx existe en el sistema de Windows 7 y lo hace.
¿Por qué falla la carga a través de LoadLibrary? ¿Cómo puedo solucionar este problema?
EDITAR: GetLastError dice (en alemán, así que solo estoy traduciendo): "No se pudo encontrar el archivo". Pero depuré la función y la ruta es "% SystemRoot% / System32 / hhctrl.ocx" y el archivo existe.
Además, dado que dos respuestas apuntan a problemas de 64 bits frente a 32 bits: Mi aplicación es un ejecutable de 32 bits compilado en C ++ Builder 5, por lo que debería ser un proceso de 32 bits si no me equivoco. ¿O estoy equivocado al asumir eso?
No puede cargar dlls de 32 bits en un proceso de 64 bits y viceversa. Los controles ActiveX son, por supuesto, Dlls.
A veces puede solucionar esto al cargar el ActiveX de 32 bits como un servidor fuera de proceso, y luego se hospeda en un proceso separado de 32 bits (o 64 bits) según corresponda. Esto requiere que ActiveX solo use interfaces que el sistema ya sepa cómo organizar, y / o que el proyecto construya versiones de 64 bits y de 32 bits del dll proxy stub.
Depende es una herramienta que es muy útil cuando necesitas descubrir por qué Dlls no se carga. Por supuesto, como una aplicación de 32 bits en un sistema operativo de 64 bits, necesita saber que las aplicaciones de 32 bits NO tienen acceso a %SYSTEMROOT%/System32
y, además, NO leen ni escriben directamente desde HKCR
. System32 en realidad contiene los binarios del sistema operativo de 64 bits, y HKCR contiene las entradas del registro para las aplicaciones de 64 bits.
Un proceso de kernel llamado ''reflexión'' redirige las aplicaciones de 32 bits de forma completamente transparente desde System32 a %SYSTEMROOT%/SysWow64
. Del mismo modo, el acceso de registro a HKEY_CLASSES_ROOT
se redirige a `HKEY_CLASSES_ROOT / Wow6432Node ''. Necesitas saber esto por supuesto, porque el explorador y el regedit son procesos de 64 bits y te mostrarán felizmente los contenidos de 64 bits de System32 y HKCR. Necesita navegar explícitamente a los nodos de 32 bits para verificar dos veces la vista que obtendrá su proceso de 32 bits.
Tengo exactamente el mismo problema ahora mismo ejecutando W7 (x64).
Lo hice funcionar cuando cambié el "% SystemRoot% / System32 / hhctrl.ocx" a "c: / windows / System32 / hhctrl.ocx", pero supongo que necesito averiguar por qué% SystemRoot% resuelve incorrectamente.
Por cierto, estoy construyendo una aplicación de 32 bits en BCB2007.
Utilice la función ExpandEnvironmentStrings para expandir% SystemRoot% / System32 / hhctrl.ocx a una ruta real en la instalación del usuario. El sistema operativo de 64 bits redirigirá correctamente la ruta expandida a la dll de 32 bits.