C++ 联机托管帮助内容

C++ 联机托管帮助内容,c++,mfc,windows-10,desktop-bridge,C++,Mfc,Windows 10,Desktop Bridge,我正在尝试使用将一些MFC应用程序打包为Windows 10应用程序 我在获取HTML帮助文件(CHM)以及使用安装的程序(新版本的VS不包含帮助文件,使用变通方法将该文件包含在一个我无权访问的文件中)方面遇到了无尽的困难 因此,我想知道如何在我的网站上托管在线帮助。出现的两个问题是如何最好地承载多个帮助主题,以及如何覆盖(在应用程序范围内)访问帮助主题的行为。(我的应用程序基于对话框。) 所以我只是想知道是否有其他人已经这样做了。我很想回顾一下这些问题是如何解决的。我在网上找不到任何东西。我确

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

我在获取HTML帮助文件(CHM)以及使用安装的程序(新版本的VS不包含帮助文件,使用变通方法将该文件包含在一个我无权访问的文件中)方面遇到了无尽的困难

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


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

我确实在一个文档中承载了我的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能够在应用程序中显示您的帮助页面,您可能需要尝试一下。

那么,当您尝试显示chm文件的主题时,会发生什么情况呢?@MichaelWalz:我不想太深入,因为我花了一个多月的时间试图解决各种问题,而且我一直在与Microsoft内部的人合作。简而言之,如果CHM文件没有作为包的一部分安装,那么如果它不存在,它将无法打开。如果文件已被复制,但您没有打开该文件的权限,MFC会给出一条关于无法加载帮助文件的一般消息。我将继续探讨这些问题,但这里我只想谈谈在线托管帮助内容。我使用了一个包(我认为不再可用)将我的CHM文件转换为HTML。示例:也就是说,您必须在应用程序中的每个对话框类中插入代码?难道没有一个通用的、底层的方法可以被重写吗?当然,您可以在主消息循环中捕获WM_COMMANDHELP。但是您必须将所有帮助上下文ID映射到处理程序中的URL。我认为这太集中了,而且工作量并不比拥有不同的OnHelpInfo()成员低。不过,您可以采取折衷的办法,使用从CDialog派生的CHelpfulDialog,将对话框id作为url的基础,或者使用从CWnd派生的chelpfullwnd,使用窗口标题生成url。但同样,您必须用派生类替换所有cdialog或cwnd,这仍然是一些工作。这正是我想要的集中化类型。我可以让该处理程序将主题ID转换为其他内容,或者——更可能的是——让网站将该ID作为参数处理。不过,我认为在基于对话框的应用程序中没有一个地方可以捕捉到这条消息。