在開發(fā)過程中經(jīng)常需要獲得程序當前的運行目錄,這時就可以使用GetCurrentDirectory()和GetModuleFileName()函數(shù),GetCurrentDirectory只是返回當前進程的當前目錄,而并不是進程的鏡像文件(.exe)所在的目錄,GetCurrentDirectory()適用于XP等系統(tǒng),,在WinCE上不能使用,GetModuleFileName()適用于WinCE2.0以后.
函數(shù)說明:
DWORD WINAPI GetModuleFileName(
HMODULE hModule,
LPTSTR lpFileName,
DWORD nSize
);
函數(shù)功能
此函數(shù)得到當前應(yīng)用程序的運行目錄,還包括應(yīng)用程序的文件名。
參數(shù)說明
hModule:要獲取文件名的模塊名柄,可以是運用LoadLiberary得到的句柄,null表示當前模塊
lpFileName:輸出參數(shù),存放取得的文件名
nSize:lpFileName參數(shù)的長度
DWORD GetCurrentDirectory(
DWORD nBufferLength, // size of directory buffer
LPTSTR lpBuffer // directory buffer
);
函數(shù)功能
找到當前進程的當前目錄
參數(shù)說明
nBufferLength:lpBuffer緩沖區(qū)的長度
lpBuffer:指定一個預定義字串,用于裝載當前目錄
返回值
調(diào)用成功 返回裝載到lpBuffer的字節(jié)數(shù)。
使用方法:
//下面的一段代碼主要是獲得當前程序的運行目錄(.exe)所在的目錄
{
CString path;
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);
}
GetModuleFileName函數(shù)
WINAPI DWORD GetModuleFileName(
HMODULE hModule,
LPWSTR lpFilename,
DWORD nSize
);
GetBuffer和ReleaseBuffer是一套需要配合使用的函數(shù), 與GetBufferSetLength相比, 優(yōu)點是如果分配的空間大于實際保存的字符串(0結(jié)尾),ReleaseBuffer會把多余申請的空間釋放, 歸還給系統(tǒng); 但使用時需要注意以下問題: 如果要保存的字符串為abc(0結(jié)尾),則GetBuffer參數(shù)應(yīng)至少為3; 如果要保存的內(nèi)容不是以0結(jié)尾, 比如是讀取文件數(shù)據(jù), 則GetBuffer參數(shù)如果大于文件長度時,ReleaseBuffer參數(shù)一定要為文件長度(如果GetBuffer參數(shù)為文件長度的話不存在問題,ReleaseBuffer參數(shù)可以為默認-1)! GetBufferSetLength相對比較容易理解, 它申請一個指定長度的空間, 即使里面最終保存的字符串長度小于申請的空間長度, 也不會將多余空間釋放.
調(diào)用示例:
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);
補充說明:
如果想得到一個已經(jīng)加載的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文件所在的目錄