【问题标题】:HTMLHelp function crashes on 64bit applicationHTMLHelp 函数在 64 位应用程序上崩溃
【发布时间】:2020-07-28 18:16:04
【问题描述】:

我正在为我的 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 应用程序中?

【问题讨论】:

  • 是在所有计算机上崩溃还是仅在您的开发计算机上崩溃?
  • 感谢您的回复。我只在开发环境中测试过。我会在不同的操作系统上尝试它。我实际上向 MSDN 发送了一个支持请求,有人评论说问题似乎与 Windows 10 SDK 相关,我必须联系其他团队。顺便说一句,我编写了 C# 包装器来调用 Help.ShowHelp() 函数并从 C++/CLI 调用它们。这似乎工作正常,但它没有从 chm 的 Popup 检索帮助描述的方法。基本上,我必须将我的描述传递给 wrapper,因为它无法从 .chm 中获取它。
  • 也可以在没有调试器的情况下尝试发布模式。如果您发现任何问题,请在此处发布答案或评论。
  • 我忘了提到我有一个 C++ 类,它封装了 HTMLHelp() 函数的调用。我通过将其声明为 CWinApp 派生类中的成员变量来创建该类的实例。我能够通过在 InitInstance 中使用“new”创建该包装类的实例来解决崩溃问题。所以,基本上,我不得不延迟对象的创建。但是,我现在遇到了一个不同的问题,我的子框架中的任何调用(例如 CMDIChildWnd::OnCommandHelp)都不会导致调用 CMDIFrameWnd::WinHelp()。相同的代码虽然在 32 位中工作。我最终可能会直接调用 WinHelp()。
  • 原来是我的错。我不得不使用 HtmlHelp 而不是 WinHelp。

标签: c++ mfc html-help


【解决方案1】:

您的代码中有问题,在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

【讨论】:

  • 感谢您的回复。那会解决它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
相关资源
最近更新 更多