首页 > 解决方案 > HTMLHelp 函数在 64 位应用程序上崩溃

问题描述

我正在为我的 MFC winforms 应用程序集成特定于上下文的帮助。根据崩溃日志,调用以下函数会使我的应用程序崩溃,而 hhctrl.ocx 是罪魁祸首。我认为问题出在 System32 位文件夹中的 64 位版本的 hhctrl.ocx 上,因为我的应用程序在 32 位模式下工作正常。我尝试注册 32 位和 64 位 ocx 但这没有帮助。

//added following line in InitInstance of application
DWORD m_dwCookie;
HtmlHelp(NULL, NULL, HH_INITIALIZE,(DWORD)&m_dwCookie);

我知道这是用于 html 帮助集成的非常古老的 API。如果我无法解决这个问题,是否有用于将帮助文件集成到 MFC 应用程序的替代框架?

标签: c++mfchtml-help

解决方案


您的代码中存在问题,在HtmlHelp调用的最后一个参数中。您将其转换为一个DWORD值,这是您不应该的。这将适用于 32 位系统,其中指针(地址)是 32 位值,但在 64 位平台/构建中,指针是 64 位,因此您的转换DWORD将消除高 32 位,然后(自动)“重新提升”为 64 位值时留下无效地址。

您需要使用的是DWORD_PTR类型,而不是(根据需要,32 位或 64 位平台的大小会有所不同):

DWORD m_dwCookie;
HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&m_dwCookie); // DWORD_PTR != DWORD

推荐阅读