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

即進去該路徑下的文件夾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM