主要就一句話:
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";
即進去該路徑下的文件夾。