문제

C ++ Builder의 이전 버전으로 작성된 레거시 Windows 응용 프로그램 내에서 HTML 도움말 파일을 열어야합니다. htmlhelp는 htmlhelp.ocx를 통해로드되며, 이로 인해 Loadlibrary를 통해 로딩됩니다.

이것은 몇 년 동안 잘 작동했지만 Windows 7 x64에서는 더 이상 작동하지 않습니다. Windows7 x86에서도 실패 할 수 있지만이 OS가있는 컴퓨터가 없으므로 지금은 시도 할 수 없습니다.

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가 Windows 7 시스템에 존재하는지 확인했습니다.

LoadLibrary를 통해로드하는 이유는 무엇입니까? 이 문제를 해결하려면 어떻게해야합니까?

편집하다: GetLasterror는 (독일어로서, 나는 단지 번역하고 있습니다) : "파일을 찾을 수 없다"고 말합니다. 그러나 함수를 디버깅했으며 경로는 "%SystemRoot% System32 hhctrl.ocx"이며 파일이 존재합니다.

또한 64 비트 대 32 비트 문제의 방향으로 두 개의 답변이 가리키기 때문에 내 응용 프로그램은 C ++ Builder 5에서 컴파일 된 32 비트 실행 파일이므로 실수하지 않으면 32 비트 프로세스가되어야합니다. 아니면 내가 그렇게 가정하는 것이 잘못 되었습니까?

도움이 되었습니까?

해결책

사용 ExpandenVironmentstrings %SystemRoot % System32 hhctrl.ocx를 사용자의 검증에 대한 실제 경로로 확장하는 기능. 64 비트 OS는 확장 경로를 32 비트 DLL로 올바르게 리디렉션합니다.

다른 팁

64 비트 프로세스에서 32 비트 DLL을로드 할 수는 없으며 Vera Vera. ActiveX 컨트롤은 물론 DLL입니다.

32 비트 ActiveX가 프로세스 외 서버로로드하도록하여이 문제를 해결할 수 있습니다. 그런 다음 별도의 32 비트 (또는 64 비트) 프로세스로 호스팅됩니다. 이를 위해서는 ActiveX만이 시스템이 이미 마샬링하는 방법을 알고 있으며/또는 프로젝트는 프록시 스터브 DLL의 64 비트 및 32 비트 버전을 구축해야합니다.


의존합니다 DLL이 왜로드되지 않는지 알아 내야 할 때 매우 유용한 도구입니다. 물론 64 비트 OS의 32 비트 응용 프로그램으로서 32 비트 응용 프로그램이 액세스 할 수 없다는 것을 알아야합니다. %SYSTEMROOT%\System32 또한 읽고 쓰지 마십시오 HKCR 곧장. System32는 실제로 64 비트 OS 바이너리를 포함하며 HKCR에는 64 비트 앱의 레지스트리 항목이 포함되어 있습니다.

'반사'라는 커널 프로세스는 32 비트 앱을 System32에서 완전히 투명하게 투명하게 %SYSTEMROOT%\SysWow64. 마찬가지로 레지스트리 액세스 HKEY_CLASSES_ROOT `hkey_classes_root wow6432node '로 리디렉션됩니다. Explorer와 Regedit은 64 비트 프로세스이며 System32 및 HKCR의 64 비트 내용을 행복하게 보여주기 때문에 물론이 사실을 알아야합니다. 32 비트 프로세스가 얻을 수있는보기를 두 번 확인하려면 32 비트 노드로 명시 적으로 탐색해야합니다.

나는 지금 W7 (x64)을 실행하는 똑같은 문제가 있습니다.

"%SystemRoot% system32 hhctrl.ocx"를 "c : wind

BTW : BCB2007에 32 비트 앱을 구축하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top