C++ 使用命令行参数在特定页面/主题打开.chm文件

C++ 使用命令行参数在特定页面/主题打开.chm文件,c++,chm,view-helpers,C++,Chm,View Helpers,我试图通过使用C++中的系统调用来打开特定页面/主题的.CHM文件(Window帮助文件)。 我可以通过以下代码成功地将.chm文件打开到起始页,但是如何将.chm文件打开到帮助文件中的特定页面/主题? system("start c:/help/myhelp.chm"); PS:我知道系统是邪恶的/不受鼓励的,但系统部分与我传递的.chm文件(该文件将指定我要打开的页面)的命令行参数并不相关。在HtmlHelp.h文件中,Windows SDK中有一个名为HtmlHelp的API。你可以这样

我试图通过使用C++中的系统调用来打开特定页面/主题的.CHM文件(Window帮助文件)。 我可以通过以下代码成功地将.chm文件打开到起始页,但是如何将.chm文件打开到帮助文件中的特定页面/主题?

system("start c:/help/myhelp.chm");

PS:我知道系统是邪恶的/不受鼓励的,但系统部分与我传递的.chm文件(该文件将指定我要打开的页面)的命令行参数并不相关。

在HtmlHelp.h文件中,Windows SDK中有一个名为HtmlHelp的API。你可以这样打电话:

HtmlHelp(GetDesktopWindow(), L"C:\\helpfile\\::/helptopic.html", HH_DISPLAY_TOPIC, NULL);
提供了有关该函数的更多信息
HtmlHelp()
通常会解析为
HtmlHelpA()
HtmlHelpW()
,具体取决于是否设置了Unicode编译器选项


另请参见。

另一个选项-使用ShellExecute。Microsoft帮助不易使用。这种方法简单得多,并且符合您的问题。下面是打开帮助文件并传递ID号的快速例程。我刚刚设置了一些简单的字符,以便您可以看到发生了什么:

    void DisplayHelpTopic(int Topic)
{

    // The .chm file usually has the same name as the application - if you don’t want to hardcode it...
    char *CmndLine = GetCommandLine(); // Gets the command the program started with.
    char Dir[255];
    GetCurrentDirectory (255, Dir);
    char str1[75] = "\0"; // Work string
    strncat(str1, CmndLine, (strstr(CmndLine, ".exe") - CmndLine)); // Pull out the first parameter in the command line (should be the executable name) w/out the .exe
    char AppName[50] = "\0";
    strcpy(AppName, strrchr(str1, '\\')); // Get just the name of the executable, keeping the '\' in front for later when it is appended to the directory

    char parms[300];
    // Build the parameter string which includes the topic number and the fully qualified .chm application name
    sprintf(parms,_T("-mapid %d ms-its:%s%s.chm"), Topic, Dir, AppName);
    // Shell out, using My Window handle, specifying the Microsoft help utility, hh.exe, as the 'noun' and passing the parameter string we build above
// NOTE: The full command string will look like this:
//   hh.exe -mapid 0 ms-its:C:\\Programs\\Application\\HelpFile.chm
    HINSTANCE retval = ShellExecute(MyHndl, _T("open"), _T("hh.exe"), parms, NULL, SW_SHOW);
}

主题在.chm文件中编号。我为每个主题设置了一个#define,因此如果我必须更改.chm文件,我可以只更改include文件以进行匹配,而不必担心在代码中搜索硬编码值。

确定参数如下:

system(" /Q /E:ON /C HH.EXE ms-its:myChm.chm::myPageName.htm");

查看此链接:感谢您发布此独立于langauge的解决方案。在Python中,
subprocess.Popen(“hh,exe ms-its:C:/path/x.chm::/dir/pg.html”)
非常有效,我可能会在Windows上使用它来显示空闲帮助。我很好奇你是否知道
/Q/E:ON/C
标志应该做什么。