MFC獲得當前應用程序目錄的GetCurrentDirectory()和GetModuleFileName()函數


在 開發過程中經常需要獲得程序當前的運行目錄,這時就可以使用GetCurrentDirectory()和GetModuleFileName()函 數,GetCurrentDirectory只是返回當前進程的當前目錄,而並不是進程的鏡像文件(.exe)所在的目 錄,GetCurrentDirectory()適用於XP等系統,,在WinCE上不能使用,GetModuleFileName()適用於 WinCE2.0以后.

函數說明:

DWORD WINAPI GetModuleFileName(
HMODULE hModule,
LPTSTR lpFileName,
DWORD nSize
);
函數功能
  此函數得到當前應用程序的運行目錄,還包括應用程序的文件名。
參數說明
  hModule:要獲取文件名的模塊名柄,可以是運用LoadLiberary得到的句柄,null表示當前模塊
  lpFileName:輸出參數,存放取得的文件名
  nSize:lpFileName參數的長度

DWORD GetCurrentDirectory(
   DWORD nBufferLength, // size of directory buffer
   LPTSTR lpBuffer // directory buffer
   );
函數功能
 找到當前進程的當前目錄
參數說明
  nBufferLength:lpBuffer緩沖區的長度
  lpBuffer:指定一個預定義字串,用於裝載當前目錄
返回值
 調用成功 返回裝載到lpBuffer的字節數。

使用方法:
//下面的一段代碼主要是獲得當前程序的運行目錄(.exe)所在的目錄
{
    CString path;
    GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    path.ReleaseBuffer();
    int pos = path.ReverseFind('\\');
    path = path.Left(pos);
}

GetModuleFileName函數
 

WINAPI DWORD GetModuleFileName(
HMODULE hModule,
LPWSTR lpFilename,
DWORD nSize
);

    GetBuffer和ReleaseBuffer是一套需要配合使用的函數, 與GetBufferSetLength相比, 優點是如果分配的空間大於實際保存的字符串(0結尾),ReleaseBuffer會把多余申請的空間釋放, 歸還給系統; 但使用時需要注意以下問題: 如果要保存的字符串為abc(0結尾),則GetBuffer參數應至少為3; 如果要保存的內容不是以0結尾, 比如是讀取文件數據, 則GetBuffer參數如果大於文件長度時,ReleaseBuffer參數一定要為文件長度(如果GetBuffer參數為文件長度的話不存在問題,ReleaseBuffer參數可以為默認-1)! GetBufferSetLength相對比較容易理解, 它申請一個指定長度的空間, 即使里面最終保存的字符串長度小於申請的空間長度, 也不會將多余空間釋放.

調用示例:
TCHAR *path = new TCHAR[MAX_PATH];
ZeroMemory(path, MAX_PATH);
// path == "d:\Project\Test\MFC\MFC\debug"
GetCurrentDirectory(MAX_PATH, path);
// path ==  "d:\Project\Test\MFC\debug\MFC.exe"
GetModuleFileName(NULL,path,MAX_PATH);

補充說明:
如果想得到一個已經加載的DLL文件的路徑,可以運用以下方法:
char  strPath[MAX_PATH];  
GetModuleFileNameA(GetModuleHandle("你的DLL名字"),strPath,MAX_PATH);
int j=strlen(strPath);
for(j=strlen(strPath);strPath[j]!='\\';j--);
strPath[j]='\0'; 
其中strPath即為你的DLL文件所在的目錄

 

 


免責聲明!

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



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