// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158
有时我们需要获得当前执行程序所在的目录.
在这种情况下, 不要相信GetCurrentDirectory()函数所得到的目录,
它只是当前工作目录, 而并非exe程序所在目录. 这种情况一般发生在:
当你在D:/dev/下有一个程序DoFile.exe, 而这个程序会处理E:/file/data.dat,
那么, 在程序执行的某个时刻, 你调用GetCurrentDirectory()函数获得的目录,
实际上是 E:/file, 而非D:/dev. 如果我们需要在程序中调用一些可执行程序目录
下的资源, 比如ini, cfg文件等等, 就会出现错误..
以下代码说明了如何在Visual C++下获得可执行程序的准确目录(当然C++ Builder也支持这种方式):
1. // 更新于2012.1.12
TCHAR szExePath[_MAX_PATH] = {0}; if(::GetModuleFileName(NULL, szExePath, _MAX_PATH) > 0) { int c = _T('\\'); *_tcsrchr(szExePath, c) = _T('\0'); }
2.old
// 函数 void get_exe_dir(TCHAR* pDir) { TCHAR szPath[_MAX_PATH]; TCHAR szDrive[_MAX_DRIVE]; TCHAR szDir[_MAX_DIR]; TCHAR szName[_MAX_FNAME]; TCHAR szExt[_MAX_EXT]; GetModuleFileName(NULL, szPath, _MAX_PATH); _tsplitpath_s(szPath, szDrive, _MAX_DRIVE, szDir, _MAX_DIR, szName, _MAX_FNAME, szExt, _MAX_EXT); _stprintf_s(pDir, _MAX_DIR, _T("%s%s"), szDrive, szDir); } // ... // 获得当前进程的可执行文件的所在目录 TCHAR szExeDir[_MAX_DIR] = {0}; get_exe_dir(szExeDir);
而对于C++ Builder, 利用VCL提供的功能, 可轻松获得:
AnsiString sExeDir = ExtractFilePath(Forms::Application->ExeName);
需要注意的是, 前者获得的路径包含/, 后者不包含.