zoukankan      html  css  js  c++  java
  • MFC中调用chm帮助文档(使用相对路径)

    主要就一句话:

    ShellExecute(NULL,L"Open",path,NULL,NULL,SW_SHOWMAXIMIZED);

    常用的显示方式是SW_SHOWNORMAL和SW_SHOWMAXIMIZED。


    路径path的设置:

    绝对路径直接写就是了。

    相对路径:

    最简单的找现在程序的运行路径;

    ShellExecute(NULL,L"open",L".\res\help.chm",NULL,NULL,SW_SHOWMAXIMIZED);

    或者,GetModuleFileName得到应用程序执行文件的所在目录

    void CRPolarView::OnUseHelp()
    {
        // TODO: 在此添加命令处理程序代码
    
        //ShellExecute(NULL,L"open",L".\res\help.chm",NULL,NULL,SW_SHOWMAXIMIZED);
        CString path; 
        GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH); 
        path.ReleaseBuffer(); 
        int pos = path.ReverseFind('\'); 
        path = path.Left(pos); 
        path = path+L"\res\help.chm";
        
        ShellExecute(NULL,L"Open",path,NULL,NULL,SW_SHOWMAXIMIZED);
        MessageBox(_T("2333333"));
    }

    两种方法分别用到的是.\与API函数GetModuleFileName获取应用程序目录

    .\是的到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。

    GetModuleFileName()得到模块的完整路径名。例如,你载入c:windowssystem32a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。

    GetModuleFileName函数原型
    DWORD GetModuleFileName(
       HMODULE hModule,     // handle to module。将要得到的模块的句柄。如果是当前模块,NULL
       LPTSTR lpFilename,   // path buffer   得到的文件名。
       DWORD nSize          // size of buffer   一般MAX_PATH就可以了

    )

    函数原型:   

    DWORD GetModuleFileName(   HMODULE hModule,   LPTSTR lpFilename,   DWORD nSize   );   

    函数参数说明:   

    hModule HMODULE 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。   

    lpFileName LPTSTR 是你存放返回的名字的内存块的指针,是一个输出参数   

    nSize DWORD ,装载到缓冲区lpFileName的最大值   

    函数返回值: 如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所为的nSize过小,哪么返回仅按所设置缓冲区大小返回相应字符串内容。

           如果函数失败,返回值将为0,并返回GetLastError异常代码。   

    需要的头文件为: include Windows.h

    得到全路径:

    TCHAR exeFullPath[MAX_PATH]; // MAX_PATH

    GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模块名称,全路径 也就是当前运行程序的全路径

    利用方法一的解析路径的方法,即可得到程序所在路径。

    参考:GetModuleFileName_李文兴_新浪博客 http://blog.sina.com.cn/s/blog_4b7c6cc00100t7j2.html


    其他:

    CString GetModulePath(CString name)
    {    
        char lpFilename[200];
        DWORD nSize = 200;
        // 得到应用程序的文件名
        GetModuleFileName(NULL,L"lpFilename",nSize);
        CString strFileName = (CString)lpFilename;
        int pos = strFileName.ReverseFind('\');
        if(pos<0)
            return L"";
        return strFileName.Left(pos+1)+name;
    };
    ShellExecute(NULL,"Open",GetModulePath(name),NULL,NULL,SW_SHOWNORMAL);

    VC++ 6.0 中,怎么实现启动一个已存在的EXE程序_百度知道 https://zhidao.baidu.com/question/12276571.html?qq-pf-to=pcqq.c2c

    路径问题:.\换成了./后就不行了,原因没深入分析。

    ShellExecute(NULL,L"open",L".\res\help.chm",NULL,NULL,SW_SHOWMAXIMIZED);

    附文件路径:

    cpp文件在 D:文件及下载相关电影VS项目RPolar_3.26_hszRPolarMainApp

    编译好的程序在 D:文件及下载相关电影VS项目RPolar_3.26_hszx64Release

    需拷贝至 D:文件及下载相关电影VS项目RPolar_3.26_hszRPolar下

    chm文件在 D:文件及下载相关电影VS项目RPolar_3.26_hszRPolar es内

    其中,

    CString path; 
        GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH); 
        path.ReleaseBuffer(); 
        int pos = path.ReverseFind('\'); 
        path = path.Left(pos); 

     是程序运行目录的路径。

    加入path = path+L"\res\help.chm";

    即进去该路径下的文件夹。

  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/wxl845235800/p/8875758.html
Copyright © 2011-2022 走看看