我用的是WinExec("hh.exe Help.chm",SW_SHOW);但是可以打开n个帮助文件,而且也不会随程序关闭,谁有经验的帮下忙?

解决方案 »

  1.   

    用CreateProcess并在主程序中记录下它的HANDLE,关闭主程序的时候先介绍它.最好第二次点击帮助菜单的时候,如果帮助文件已经打开就激活它
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个用FindWindow,如果找到了就用SetForegroundWindow激活它.
      

  2.   

    重载OnHelpInfo(HELPINFO* pHelpInfo) /*
    重载函数:弹出帮助程序
    */
    BOOL CMainFrame::OnHelpInfo(HELPINFO* pHelpInfo) 
    {
    CString szHelpFile=m_ProDir+"masterhelp.chm";
    HWND hwnd =::HtmlHelp(GetDesktopWindow()->m_hWnd ,szHelpFile,HH_DISPLAY_TOPIC,NULL) ; 

    return CFrameWnd::OnHelpInfo(pHelpInfo);
    }
    HtmlHelp定义在HtmlHelp.h
    在Html Help workshop的安装目录下可以找到.同时要把在该文件夹下的help  . lib拷贝的你的工程。然后包含进来:
    #pragma comment(lib,"Htmlhelp.lib")
      

  3.   

    是不是类似于只让系统中运行一个程序
    如果是的话,请看下面的回答有两种方法
    1 进程互斥的方法。当打开第二个程序的时候,不让它打开
    2 这种方法是打开一个进程以后,再打开的时候把前一个进程关闭,再启动一次本进程代码如下
    第二种方法如下#define BBB_AX_BX_CX   _T("BBB_AX_BX_CX_FILEMAPPING_LDF_51900")
    在下面加入代码
    BOOL CBbbApp::InitInstance()
    {
          HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, BBB_AX_BX_CX);
    LPBYTE lpData = NULL;
    if(hProcessID != NULL) // 已经有服务在运行了.
    {
    lpData = (LPBYTE)::MapViewOfFile(hProcessID, 
    FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
    DWORD dwID = 0;
    if(lpData != NULL)
    {
    dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID
    }
    ::UnmapViewOfFile(lpData);
    ::CloseHandle(hProcessID);
    if(dwID != 0) // 通过ID来退出进程
    {
    HANDLE hHandle = NULL;
    hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
    ::TerminateProcess(hHandle, 0);
    ::WaitForSingleObject(hHandle, INFINITE);
    ::CloseHandle(hHandle);
    }
    }
    hProcessID = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE,
    0, sizeof(DWORD), BBB_AX_BX_CX);
    if(hProcessID != NULL) // 创建新的文件映象,保存本进程的ID
    {
    lpData = (LPBYTE)::MapViewOfFile(hProcessID, 
    FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
    if(lpData != NULL)
    {
    DWORD dwID = ::GetCurrentProcessId();
    memcpy(lpData, &dwID, sizeof(DWORD));
    }
    }}第一种方法就用两句话。忘了,
    明天早上再来回答第一种方法
      

  4.   

    看来你用第二种方案是最可行的,当关闭程序的时候就直接用上下面的代码就可以关闭
    #define FAMILY_PROTECT _T("BBB_AX_BX_CX_FILEMAPPING_LDF_51900")
    HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE,FAMILY_PROTECT);
    LPBYTE lpData = NULL; if(hProcessID != NULL) 
    {
    lpData = (LPBYTE)::MapViewOfFile(hProcessID, 
    FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
    DWORD dwID = 0;
    if(lpData != NULL)
    {
    dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID
    }
    ::UnmapViewOfFile(lpData);
    ::CloseHandle(hProcessID);
    if(dwID != 0) // 通过ID来退出进程
    {
    HANDLE hHandle = NULL;
    hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
    ::TerminateProcess(hHandle, 0);
    ::WaitForSingleObject(hHandle, INFINITE);
    ::CloseHandle(hHandle);
    }
    }
    else
    {
    return;
    }
      

  5.   

    利用互斥的方式实现系统中只运行一个进程就2行代码加入到BOOL CXXXApp::InitInstance()中 HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName); 
            if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }
      

  6.   

    changlele(梦幻水晶) ,这跟系统中只运行一个进程不太像,因为我是在应用程序里控制帮助文件的打开与否,关闭帮助文件的时候没法通知应用程序我关闭了。
      

  7.   

    jszj(老板说mis部不是赚钱的部门) ,你这么说我还是不会做,呵呵。我还是菜鸟,能不能给点代码什么的,如果你有空的话。
      

  8.   

    skyxie(黑白精灵) :我听别人也是这么说的,但是“用CreateProcess并在主程序中记录下它的HANDLE”这个不太明白该怎么做
      

  9.   

    HWND hwnd = ::FindWindow(类名称,窗口名称);
    if(hwnd)
       ::ShowWindow(hwnd,SW_HIDE);
      

  10.   

    搞定了,其实如果用这个命令的话,就不会有那些问题!
    ::HtmlHelp(NULL, "Help.chm", HH_DISPLAY_TOPIC, 0);