我需要从用旧版 C++ Builder 编写的旧 Windows 应用程序中打开一个 html 帮助文件。HtmlHelp 是通过 HtmlHelp.ocx 加载的,我是通过 LoadLibrary 加载的。
这多年来一直运行良好,但在 Windows 7 x64 中不再适用。在 Windows7 x86 下它也可能会失败,但我没有任何具有此操作系统的计算机,因此我目前无法尝试。
我正在动态加载 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;
}
我检查了 Windows 7 系统上是否存在 %SystemRoot%\System32\hhctrl.ocx 并且确实存在。
为什么通过 LoadLibrary 加载它会失败?我该如何解决这个问题?
编辑: GetLastError 说(用德语,所以我只是在翻译):“找不到文件。” 但我调试了函数,路径是“%SystemRoot%\System32\hhctrl.ocx”,文件确实存在。
此外,由于两个答案指向 64 位与 32 位问题的方向:我的应用程序是在 C++ Builder 5 中编译的 32 位可执行文件,因此如果我没记错的话,它应该是 32 位进程。还是我错误地假设?