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
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 网络环境下教育教学的探索与实施.docx
- Ahdqyln计算机专业大学本科方案设计书(网络).doc
- 数据库课程设计(实例-).doc
- 单片机万年历电子钟方案设计书报告含电路图和源程序.doc
- 2010年9月全国计算机等级测验二级笔试试卷C语言程序设计.docx
- workerman-PHP资源
- 计算机软件应用与发展分析.docx
- 麻村砂石加工系统安全渡汛措施.doc
- 论网络环境中的图书馆藏书发展.docx
- 一级分类食品饮料、家居用品、个人用品、IT与电子商务、耐用品.doc
- 工作任务8-网站宣传与推广.ppt
- 基于大学城空间的动态网页课程信息化教学设计.docx
- ATS单片机的数字温度测量及显示系统设计方案.doc
- 贫困地区的教育信息化发展障碍及对策.docx
- 论大数据对高校教育的推动作用.docx
- Freescale单片机电池管理系统设计方案.doc


