主要就一句话:

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

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


路径path的设置:

绝对路径直接写就是了。

相对路径:

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

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

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

  1. void CRPolarView::OnUseHelp()
  2. {
  3. // TODO: 在此添加命令处理程序代码
  4.  
  5. //ShellExecute(NULL,L"open",L".\\res\\help.chm",NULL,NULL,SW_SHOWMAXIMIZED);
  6. CString path;
  7. GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+),MAX_PATH);
  8. path.ReleaseBuffer();
  9. int pos = path.ReverseFind('\\');
  10. path = path.Left(pos);
  11. path = path+L"\\res\\help.chm";
  12.  
  13. ShellExecute(NULL,L"Open",path,NULL,NULL,SW_SHOWMAXIMIZED);
  14. MessageBox(_T(""));
  15. }

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

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

GetModuleFileName()得到模块的完整路径名。例如,你载入c:\windows\system32\a.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


其他:

  1. CString GetModulePath(CString name)
  2. {
  3. char lpFilename[];
  4. DWORD nSize = ;
  5. // 得到应用程序的文件名
  6. GetModuleFileName(NULL,L"lpFilename",nSize);
  7. CString strFileName = (CString)lpFilename;
  8. int pos = strFileName.ReverseFind('\\');
  9. if(pos<)
  10. return L"";
  11. return strFileName.Left(pos+)+name;
  12. };
  13. 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

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

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

附文件路径:

cpp文件在 D:\文件及下载相关\电影\VS项目\RPolar_3.26_hsz\RPolar\MainApp

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

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

chm文件在 D:\文件及下载相关\电影\VS项目\RPolar_3.26_hsz\RPolar\res内

其中,

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

是程序运行目录的路径。

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

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

MFC中调用chm帮助文档(使用相对路径)的更多相关文章

  1. VC++/MFC中调用CHM帮助文档的方法

    转载:http://blog.csdn.net/hediping9811/article/details/23341387 (1)用Word编辑好帮助文档,并保存为网页格式,如mhtml格式. (2) ...

  2. .net应用程序中添加chm帮助文档打开显示此程序无法显示网页问题

    在做.net大作业时添加了chm帮助文档结果在打开时显示“此程序无法显示网页问题”,但是把帮助文档拷到别的路径下却显示正常, 经过从网上查找,终于找到了答案: (1).chm文件的路径中不能含有“#” ...

  3. 在MFC中怎么获得Excel文档中已经使用了的行数和列数

    _Worksheet ws;Range range; range = ws.GetUsedRange();//获得Worksheet已使用的范围range = range.GetRows();   / ...

  4. 【VS开发】【CUDA开发】如何在MFC中调用CUDA

    如何在MFC中调用CUDA 有时候,我们需要在比较大的项目中调用CUDA,这就涉及到MFC+CUDA的环境配置问题,以矩阵相乘为例,在MFC中调用CUDA程序.我们参考罗振东iylzd@163.com ...

  5. jQuery LigerUI 最新版压缩包(含chm帮助文档、源码、donet权限示例)

    jQuery LigerUI 最新版压缩包 http://download.csdn.net/download/heyin12345/4680593 jQuery LigerUI 最新版压缩包(含ch ...

  6. C# CHM帮助文档

    1.生成chm文件 首先,下载EasyCHM软件,此软件可将HTML文件.TXT文件.图片和文件夹按照文件层次生成.chm文件.EasyCHM打开界面如图所示: 点击“新建”,选择需要生成.chm文件 ...

  7. 用VC++MFC做文本编辑器(单文档模式)

    用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlna ...

  8. 使用 Python 翻译 CHM 帮助文档

    此方法绝对切实可行 翻译成品项目: https://github.com/foyoux/InstallShield2020-Documents 效果预览 安装 docts 库 pip install ...

  9. Ubuntu 14 如何打开 .chm格式文档?

    好多手册是.chm格式,Ubuntu是需要安装第三方软件才能打开.chm格式文档,操作方式如下: 到“软件中心” -> 搜索“xchm”,并安装 -> 右键某个.chm文档,选择“属性” ...

随机推荐

  1. firefox dispatchevent的问题

    <!DOCTYPE html><html><head lang="en">    <meta charset="UTF-8&qu ...

  2. DWZ(一):框架初了解

    DWZ富client框架(jQuery RIAframework),是中国人自己开发的基于jQuery实现的Ajax RIA开源框架. DWZ富client框架设计目标是简单有用.扩展方便.高速开发. ...

  3. android应用开发-从设计到实现 2-8 组件与经常使用模式

    组件与经常使用模式 前面已经比較全面的介绍了Material Design相关的设计哲学.设计原理和方法论. 这一章開始,我们将看看这些原理是怎样在安卓系统其中得到实践的. 一个应用并非全然从什么都没 ...

  4. char p[]与char *p的区别

    #include <iostream> using namespace std; int main(void) { char *pp = "abc";//*pp指向的是 ...

  5. netty参考

    前言 问题 现如今我们使用通用的应用程序或者类库来实现系统之间地互相访问,比如我们经常使用一个HTTP客户端来从web服务器上获取信息,或者通过web service来执行一个远程的调用. 然而,有时 ...

  6. 淘宝JAVA中间件Diamond

    以下是转载自网上资料,但是根据步骤可以搭建出diamond配置中心服务器. 项目中需要用到diamond的理由是, 项目中使用了很多定时任务和异步任务.而且这些定时任务和异步任务都是分布式的安排在多个 ...

  7. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何查询某个变量的ADS地址

    鼠标放到任意一个参数上停留一段时间,会自动弹出关于该条参数的ADS信息   TC3也是一样(如果不是轴的某个参数而是PLC程序绑定的某个变量也是一样,定位到这个变量既可以看到ADS信息)       ...

  8. 倍福TwinCAT(贝福Beckhoff)应用教程13.2 TwinCAT控制松下伺服 CS说明

    虚拟仿真上,要注意仿真只是为了可视化,可以看到数据的变动是否和实际一致,所以Robot2D才是主要因素,虚拟仿真采集机器人的关节位置或者TCP位置来显示而已,为了测试一些别的算法,我们还可以在虚拟仿真 ...

  9. C++11 Lambda表达式简单解析

    C++11 新增了非常多特性,lambda 表达式是当中之中的一个.假设你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 非常多语言都提供了 la ...

  10. java.net.ConnectException: failed to connect to /10.0.2.2 (port 80): connect

    在使用GENYMOTION作为Android程序调试模拟器连接web服务器时,报了:java.net.ConnectException: failed to connect to /10.0.2.2 ...