获得当前应用程序目录的GetCurrentDirectory()和GetModuleFileName()函数 .

bool CtestDlg::GetXMLMessage(void) 
{ 
    char cModulePath[MAX_PATH] = {0}; 
    ::GetModuleFileName(NULL, cModulePath, MAX_PATH); 
    ::PathRemoveFileSpec(cModulePath); 
  
    char cCurrentPath[MAX_PATH] = {0}; 
    ::GetCurrentDirectory(MAX_PATH, cCurrentPath); 
  
    string strPath = cModulePath; 
    strPath += "\\Log.xml"; 
  
    CMarkup markup; 
    if ((!markup.Load(strPath.c_str())) 
        || (!markup.IsWellFormed()) 
        || (!markup.FindElem(szUTPSDocRoot)) 
        ) 
    { 
        return false; 
    } 
  
    markup.IntoElem(); 
    ASSERT(0 == m_vecLogItem.size()); 
  
    LOGITEM li; 
    while (true) 
    { 
        if (!markup.FindElem(szItemLabel)) 
        { 
            break; 
        } 
  
        li.strName = markup.GetAttrib(szLabelName); 
        li.bShow = (markup.GetAttrib(szLabelShow)=="true" ? true : false); 
        li.strResourceID = markup.GetAttrib(szLabelResource); 
  
        m_vecLogItem.push_back(li); 
    } 
  
    return true; 
} 
  
void CtestDlg::PopulateList(void) 
{ 
    m_listLog.InsertColumn(0, "Name", LVCFMT_CENTER, 200); 
    m_listLog.InsertColumn(1, "Resource", LVCFMT_CENTER, 200); 
  
    vector<LOGITEM>::iterator it; 
    for (it=m_vecLogItem.begin(); it!=m_vecLogItem.end(); it++) 
    { 
        string strName = it->strName; 
        bool bShow = it->bShow; 
        string strResourceID = it->strResourceID; 
        if (bShow) 
        { 
            int nRow; 
            nRow = m_listLog.InsertItem(0, strName.c_str()); 
            m_listLog.SetItemText(nRow, 1, strResourceID.c_str()); 
        } 
    } 
}


 

实测(debug运行):
GetModuleFileName 得到 "f:\test\Debug\test.exe"
GetCurrentDirectory 得到 "f:\test"

我想得到当前exe,运行时的所在路径。岂不是不能用GetCurrentDirectory,而一定要用GetModuleFileName。
再用PathRemoveFileSpec移去\test.exe,从而得到“f:\test\Debug”。

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
在开发过程中经常需要获得程序当前的运行目录,这时就可以使用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
   );
函数功能
 找到当前进程的当前目录 (注意:当前目录是可变的,如在vs2010环境下运行,得到的是工程文件所在的目录;如果在cmd下运行可执行文件,此时的目录就是exe文件所在的目录,此时与GetModuleFileName结果就相差一个可执行文件名。)
参数说明
  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文件所在的目录

你可能感兴趣的:(C++,c,mfc,当前目录)