• 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";

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

  • 相关阅读:
    MyBatis框架Dao代理
    MyBatis对象分析及创建工具类
    搭建MyBatis开发环境及基本的CURD
    IDEA中配置Maven
    rpm 安装mysql8.0 ;安装deb
    SpringBoot 整合 xxl-job 指导手册
    设计模式(一) 单例设计模式
    SpringCloud (三) Eureka 注册中心
    SpringCloud (二) 注册中心理论
    SpringCloud (一) 微服务入门
  • 原文地址:https://www.cnblogs.com/wxl845235800/p/8875758.html
Copyright © 2020-2023  润新知