我需要从旧版本的C++ Builder中编写的遗留Windows应用程序中打开html帮助文件。 HtmlHelp通过HtmlHelp.ocx加载,我通过LoadLibrary加载。OCX文件上的LoadLibrary在Windows 7中失败x64
这已经很好用了很多年,但它在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;
}
我如果检查的%SystemRoot%\ SYSTEM32 \ HHCTRL.OCX所在的Windows 7系统上它。
为什么通过LoadLibrary加载失败?我该如何解决这个问题?
编辑: GetLastError说(德语,所以我只是翻译):“无法找到文件。”但我调试的功能和路径是“%SystemRoot%\ System32 \ hhctrl.ocx”,该文件确实存在。另外,由于两个答案指向了64位和32位的问题:我的应用程序是一个在C++ Builder 5中编译的32位可执行文件,所以如果我没有弄错它应该是一个32位的过程。或者我错了假设?
GetLastError和FileMon会说什么? – 2009-11-17 16:50:13
好点。见上面的第一个编辑。 – 2009-11-18 09:25:41