c++_获取当前程序(EXE)所在的路径
在C++编程中,获取当前程序(EXE)所在的路径是一项基本但重要的技能,尤其是在处理文件操作、资源定位或动态库加载等场景时。本文将详细介绍如何使用C++获取当前程序所在路径的方法,并深入探讨其背后的原理及注意事项。 ### 一、只获得路径字符串不包含文件名 获取当前程序路径而不包含文件名可以通过以下步骤实现: ```cpp #include <windows.h> #include <string> std::string getCurrentDirectoryPath() { TCHAR szFilePath[MAX_PATH + 1] = {0}; GetModuleFileName(NULL, szFilePath, MAX_PATH); std::string path(szFilePath); // 删除文件名,只保留路径 size_t lastSlashPos = path.find_last_of("\\/"); if (lastSlashPos != std::string::npos) { return path.substr(0, lastSlashPos + 1); } return ""; // 如果找不到斜杠,则返回空字符串 } ``` 这段代码首先调用`GetModuleFileName`函数来获取当前模块的完整路径和文件名,然后通过查找最后一个反斜杠(或正斜杠,取决于操作系统)的位置,从而截取路径部分,去除文件名。 ### 二、获得双斜杠路径不包含文件名 为了得到路径中的双斜杠格式,可以采用如下方式: ```cpp std::string getDoubleSlashPath() { TCHAR _szPath[MAX_PATH + 1] = {0}; GetModuleFileName(NULL, _szPath, MAX_PATH); std::string strPath; for (int n = 0; _szPath[n]; n++) { if (_szPath[n] != '\\') { strPath += _szPath[n]; } else { strPath += "//"; } } // 同样,去除文件名部分 size_t lastSlashPos = strPath.find_last_of("//"); if (lastSlashPos != std::string::npos) { return strPath.substr(0, lastSlashPos + 2); } return ""; } ``` ### 三、获取应用程序自身完整路径文件名 除了获取不含文件名的路径外,有时我们也需要知道当前程序的完整路径,包括文件名。有几种常见方法可以实现这一需求: #### 方法1:使用`_pgmptr` ```cpp #include <stdlib.h> int main() { std::cout << _pgmptr << std::endl; return 0; } ``` `_pgmptr`是一个预定义的宏,它指向程序的主可执行文件名。 #### 方法2:使用`GetModuleFileName` ```cpp char szFullPath[MAX_PATH]; ZeroMemory(szFullPath, MAX_PATH); ::GetModuleFileName(NULL, szFullPath, MAX_PATH); ::MessageBox(NULL, szFullPath, "path", MB_ICONINFORMATION); ``` `GetModuleFileName`函数用于获取指定模块的完整路径和文件名,当参数为`NULL`时,表示获取当前进程的模块路径。 #### 方法3:结合`TCHAR`与`GetModuleFileName` ```cpp TCHAR szPath[MAX_PATH] = {0}; if (!GetModuleFileName(NULL, szPath, MAX_PATH)) { // 错误处理 } // 输出或使用szPath ``` ### 四、如何获取应用程序所在目录? 获取应用程序所在目录时,应避免使用`GetCurrentDirectory`,因为该函数返回的是当前工作目录,而并非程序的启动位置。更安全的做法是先通过`GetModuleFileName`获取完整路径,然后解析出目录部分。 ```cpp #include <windows.h> #include <string> std::string getApplicationDirectory() { TCHAR szPath[MAX_PATH] = {0}; GetModuleFileName(NULL, szPath, MAX_PATH); std::string path(szPath); // 找到并保留目录部分 size_t lastSlashPos = path.find_last_of("\\/"); if (lastSlashPos != std::string::npos) { return path.substr(0, lastSlashPos + 1); } return ""; } ``` 通过上述方法,我们可以准确地获取当前程序的所在目录,这对于编写跨平台或需要高度自适应性的应用程序至关重要。
- TearyWang2012-11-09不好,一搜一堆,全部都是GetModuleFileName,想找个C/C++的接口~
- caon123yede2013-12-10真是的,这两分算是浪费了。没有多大的作用。
- 粉丝: 2
- 资源: 14
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- tomcat6.0配置oracle数据库连接池中文WORD版最新版本
- hibernate连接oracle数据库中文WORD版最新版本
- MyEclipse连接MySQL的方法中文WORD版最新版本
- MyEclipse中配置Hibernate连接Oracle中文WORD版最新版本
- MyEclipseTomcatMySQL的环境搭建中文WORD版3.37MB最新版本
- hggm - 国密算法 SM2 SM3 SM4 SM9 ZUC Python实现完整代码-算法实现资源
- SQLITE操作入门中文WORD版最新版本
- Sqlite操作实例中文WORD版最新版本
- SQLITE特性分析中文WORD版最新版本
- ORACLE创建表空间中文WORD版最新版本