古いバージョンのC++Builderで記述されたレガシーWindowsアプリケーション内からhtmlヘルプファイルを開く必要があります。HtmlHelpは、LoadLibraryを介してロードしているHtmlHelp.ocxを介してロードされます。
これは何年も問題なく機能していましたが、Windows7x64では機能しなくなりました。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がWindows7システムに存在するかどうかを確認しました。
LoadLibraryを介したロードが失敗するのはなぜですか?この問題を回避するにはどうすればよいですか?
編集: GetLastErrorは(ドイツ語で、私はただ翻訳しているだけです)と言います:「ファイルが見つかりませんでした。」しかし、関数をデバッグしたところ、パスは「%SystemRoot%\ System32 \ hhctrl.ocx」であり、ファイルは存在します。
また、2つの答えが64ビットと32ビットの問題の方向を示しているため、私のアプリケーションはC ++ Builder 5でコンパイルされた32ビットの実行可能ファイルであるため、間違えなければ32ビットのプロセスになるはずです。それとも私はそれを仮定するのは間違っていますか?