在開發過程中經常需要獲得程序當前的運行目錄,這時就可以使用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文件所在的目錄