【发布时间】: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。