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:\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
其他:
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_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内
其中,
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";
即进去该路径下的文件夹。