Pergunta

Preciso abrir um arquivo de ajuda HTML de um aplicativo Legacy Windows escrito na versão antiga do C ++ Builder. Htmlhelp é carregado via htmlhelp.ocx, que estou carregando via carga de carga.

Isso funcionou bem há anos, mas não funciona mais no Windows 7 X64. Também pode falhar no Windows7 X86, mas não tenho nenhum computador com este sistema operacional, por isso não posso experimentar no momento.

Estou carregando hhctrl.ocx dinamicamente da seguinte forma:

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

Eu verifiquei se o %Systemroot % System32 hhctrl.ocx existe no sistema Windows 7 e ele acontece.

Por que carregá -lo por meio de falha na biblioteca? Como posso resolver esse problema?

EDITAR: Getlasterror diz (em alemão, então estou apenas traduzindo): "Não consegui encontrar o arquivo". Mas depurei a função e o caminho é "%Systemroot% System32 hhctrl.ocx" e o arquivo existe.

Além disso, como duas respostas apontam na direção de problemas de 64 bits vs 32 bits: meu aplicativo é um executável de 32 bits compilado no C ++ Builder 5, por isso deve ser um processo de 32 bits se não for enganado. Ou estou errado em assumir isso?

Foi útil?

Solução

Usar Expandenvironmentstrings função para expandir %Systemroot % System32 hhctrl.ocx para o caminho real na intalação do usuário. O sistema operacional de 64 bits redirecionará o caminho expandido para DLL de 32 bits corretamente.

Outras dicas

Você não pode carregar DLLs de 32 bits em um processo de 64 bits e visa versa. Os controles ActiveX são, obviamente, DLLs.

Às vezes, você pode contornar isso, fazendo com que o ActiveX de 32 bits seja carregado como um servidor fora do processo-é hospedado em um processo separado de 32 bits (ou 64 bits), conforme apropriado. Isso exige que o ActiveX OnlyUse interface o sistema que já sabe como marechar e/ou o projeto construiu versões de 64 bits e 32 bits da DLL do proxy Stub.


Depende é uma ferramenta que é muito útil quando você precisa descobrir por que as DLLs não carregam. Obviamente, como um aplicativo de 32 bits em um sistema operacional de 64 bits, você precisa saber que aplicativos de 32 bits não têm acesso a %SYSTEMROOT%\System32 E também não leia e escreva de HKCR diretamente. Na verdade, o System32 contém os binários do sistema operacional de 64 bits, e o HKCR contém as entradas do registro para aplicativos de 64 bits.

Um processo de kernel chamado 'reflexão' redireciona aplicativos de 32 bits de forma transparente para o System32 para %SYSTEMROOT%\SysWow64. Da mesma forma, acesso do registro a HKEY_CLASSES_ROOT é redirecionado para `hkey_classes_root wow6432node '. Você precisa saber isso, é claro, porque o Explorer e o Regedit são processos de 64 bits e mostrarão felizmente o conteúdo de 64 bits do System32 e HKCR. Você precisa navegar explicitamente para os nós de 32 bits para verificar a visualização que seu processo de 32 bits será obtido.

Eu tenho exatamente o mesmo problema agora em execução W7 (x64).

Comecei a funcionar quando alterei o "%Systemroot% System32 hhctrl.ocx" para "C: Windows System32 hhctrl.ocx", mas acho que preciso descobrir por que%Systemroot%resolve errado.

BTW: Estou construindo um aplicativo de 32 bits no BCB2007.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top