可以调用 HtmlHelp API 并将所有权传递给另一个进程

Possible to call HtmlHelp API and pass ownership to another process?

本文关键字:另一个 进程 所有权 调用 HtmlHelp API      更新时间:2023-10-16

我从进程 B 调用 HtmlHelp 并传递另一个进程(进程 A,启动当前进程 B 的进程)的 HWND,以尝试将帮助窗口绑定到我的父进程 (A)。

然后我的进程 (B) 退出,但这仍然导致 HTML 帮助窗口也退出。如何避免帮助查看器退出并将其链接到进程 A 的生存期?

根据MSDN

hwndCaller 指定调用 HtmlHelp() 的窗口的句柄 (hwnd)。帮助窗口归此窗口所有。 当帮助窗口关闭时,HtmlHelp() 会将焦点返回给所有者,除非所有者是桌面。

API 调用很简单;

HtmlHelpA(procWindow, "hlp.chm", HH_DISPLAY_TOPIC, help_pointer);

背景:

有一个非常旧的Fortran程序,它启动winhelp(旧的帮助格式),我正在将其迁移到HtmlHelp(较新的API和格式)。我无法直接从此旧代码调用 Win32 HtmlHelp API,因为它挂起(由堆栈大小和位置引起,我无法更改)。

为了绕过这一点,我正在从Fortran代码中掏出一个新进程,然后该进程具有可以成功启动帮助的默认堆栈大小。

帮助代理代码是使用 SilverFrost C 编译器编译的,因此它不会引入更多的依赖项(主要应用程序是 SilverFrost Fortran)。

帮助窗口由加载到调用函数的进程中的hhctrl.ocx模块显示 HtmlHelp hhctrl.ocx 导出。这意味着帮助窗口不能超过调用HtmlHelp的进程。因为当该进程终止时,它的窗口被销毁,它的模块被卸载。

您可以通过一些方法处理此问题:

  1. 不要使用 HtmlHelp 函数,而是使用帮助查看器进程hh.exe来托管帮助文件。
  2. 安排进程 A 以调用HtmlHelp
  3. 让不同的进程调用 HtmlHelp ,这是您当前使用的方法。
  4. 确保进程 B 的寿命超过进程 A。