【问题标题】:Hosting help content online在线托管帮助内容
【发布时间】:2017-11-20 18:22:00
【问题描述】:

我正在尝试使用 Desktop Bridge 将我的一些 MFC 应用程序打包为 Windows 10 应用程序。

我在获取包含我的 HTML 帮助文件 (CHM) 并使用已安装的程序时遇到了无穷无尽的麻烦(新版本的 VS 不包含帮助文件,并且使用解决方法来包含该文件会导致文件我没有访问权限)。

所以这让我想知道在我的网站上托管在线帮助。出现的几个问题是如何最好地托管多个帮助主题,以及如何覆盖(在应用程序范围内)访问帮助主题的行为。 (我的应用是基于对话框的。)

所以我只是想知道是否其他人已经这样做了。我很想回顾一下这些问题是如何解决的。我在网上找不到任何东西。

【问题讨论】:

  • 那么当您尝试显示 chm 文件的主题时,究竟会发生什么?
  • @MichaelWalz:我不想在这方面走得太远,因为我已经花了一个多月的时间试图解决各种问题,而且我一直在与 Microsoft 内部的人合作。简而言之,如果 CHM 文件没有作为包的一部分安装,则如果它不存在,则无法打开。如果文件被复制但您没有打开文件的权限,MFC 会给出一条关于无法加载帮助文件的通用消息。我继续探索这许多问题,但在这里我只想谈谈在线托管帮助内容。
  • 我使用了一个包(我认为它不再可用)将我的 CHM 文件转换为 HTML。示例:publictalksoftware.co.uk/msa/HelpOnline
  • 还有helpndoc.com

标签: c++ mfc windows-10 desktop-bridge


【解决方案1】:

我确实将我的 html 帮助托管在一个文档中,使用 html 锚点来获取感兴趣的主题。如果您有多个页面,请相应地调整 MyHelp。

我实际上并没有使用桌面桥,但想知道您是否尝试过这样的事情:

BOOL CMyDialog::OnHelpInfo(HELPINFO* pHelpInfo) 
{
    MyHelp(_T("HIDD_MYDIALOG"));            // HTML anchor goes here
    return CDialog::OnHelpInfo(pHelpInfo);
}

...

// a global helper function for showing help
void MyHelp(LPCTSTR anchor)
{
    extern CMyApp theApp;
    TCHAR *cp, buffer[1000];

    // look for the html document in the program directory
    strcpy(buffer, _T("file:///"));
    DWORD dw = GetModuleFileName(theApp.m_hInstance, buffer + strlen(buffer), sizeof(buffer));

    if (cp = strrchr(buffer, '\\'))
    {
        strcpy(cp+1, _T("MyHelpDocument.htm#"));
        strcat(cp+1, anchor);

        // for some reason, I don't want the default browser to open, just the Internet Explorer
        ShellExecute(NULL, _T("open"), _T("iexplore"), buffer, NULL, SW_SHOWNORMAL);
            // or, for real online help, use just '_T("http://myurl.com/myonlinehelpdocument.html#") + anchor'
            // instead of 'buffer' and ommit all before ShellExecute()
    }
}

我不确定 ShellExecute 是否会像以前在商店应用程序中那样运行。但肯定会有办法以某种方式打开 URL。如果 Internet Explorer ActiveX 可以在应用程序中显示您的帮助页面,您可能想尝试一下。

【讨论】:

  • 所以您必须在应用程序的每个对话框类中插入代码?难道没有可以覆盖的通用底层方法吗?
  • 当然,您可以在主消息循环中捕获 WM_COMMANDHELP。但是您必须将所有帮助上下文 ID 映射到处理程序中的 url。我认为这太集中了,工作量并不比拥有不同的 OnHelpInfo() 成员低。不过,您可以进行折衷,使用从 CDialog 派生的 CHelpfulDialog 以对话框 id 作为您的 url 的基础,或者从 CWnd 使用 CHelpfulWnd,使用窗口标题生成 url。但同样,您必须用派生类替换所有 CDialogs 或 CWnds,这仍然是一些工作。
  • 这正是我要寻找的集中化类型。我可以让该处理程序将主题 ID 转换为其他内容,或者 - 更有可能 - 让网站只将 ID 作为参数处理。我会玩的。
  • 但是,我认为在基于对话框的应用程序中没有一个地方可以捕获此消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多