C++ 中获取EXE路径

一、

1.只获得路径字串不包含文件名

TCHAR szFilePath[MAX_PATH + 1]={0};
GetModuleFileName(NULL, szFilePath, MAX_PATH);
(_tcsrchr(szFilePath, _T('\\')))[1] = 0; // 删除文件名,只获得路径字串
CString str_url = szFilePath;  // 例如str_url==e:\program\Debug\
---------------------------------------------------------
2.获得双斜杠路径不包含文件名

TCHAR _szPath[MAX_PATH + 1]={0};
GetModuleFileName(NULL, _szPath, MAX_PATH);
(_tcsrchr(_szPath, _T('\\')))[1] = 0;//删除文件名,只获得路径 字串
CString strPath;
for (int n=0;_szPath[n];n++)
{
if (_szPath[n]!=_T('\\'))
{
strPath +=_szPath[n] ;
}
else
{
strPath += _T("\\\\");
}
}

MessageBox(strPath);//输出==e:\\program\\Debug\\


二、
1:获取应用程序自身完整路径文件名
方法1:
#include "stdlib.h"
void main()
{
cout << _pgmptr << endl;
}

方法2:
char szFullPath[MAX_PATH];
ZeroMemory(szFullPath,MAX_PAT);
::GetModuleFileName(NULL,szFullPath,MAX_PATH);
::MessageBox(NULL,szFullPath,"path",MB_ICONINFORMATION);

方法3:
TCHAR szPath[MAX_PATH] = {0};
if(!GetModuleFileName(NULL, szPath, MAX_PATH))
{ return ; }
AfxMessageBox(szPath);

2:如何获取应用程序所在目录?
这里值得注意的是很多人都用
GetCurrentDirectory(MAX_PATH, szCurrentPath);
来获取。这个方法并不好,经常出错,比如现在我有一个程序在d:\test目录下,现在运行这个程序后用GetCurrentDirectory得到的是d:\test

。接着在程序里用CFileDialog来打开一个C:\test\test.txt文件后再调用GetCurrentDirectory,那么得到的szCurrentPath就是C:\test而不是d:\test。

推荐用如下方法来得到当前程序所在目录比较安全:
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );
函数来分解开始提到的_pgmptr,然后再用
void _makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext );
函数来对分解后的路径进行组合。这两个函数结合起来功能强大,使用灵活,基本上所有的有关目录和路径方面的操作都可以搞定。

转载于:http://hi.baidu.com/wyuanshiy/blog/item/7818a5ec6ffab422269791dc.html

 

 MSDN的用法:

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3.   
  4. int main( void )  
  5. {  
  6.    char path_buffer[_MAX_PATH];  
  7.    char drive[_MAX_DRIVE];  
  8.    char dir[_MAX_DIR];  
  9.    char fname[_MAX_FNAME];  
  10.    char ext[_MAX_EXT];  
  11.    errno_t err;  
  12.   
  13.    err = _makepath_s( path_buffer, _MAX_PATH, "c""\\sample\\crt\\",  
  14.                       "crt_makepath_s""c" );  
  15.    if (err != 0)  
  16.    {  
  17.       printf("Error creating path. Error code %d.\n", err);  
  18.       exit(1);  
  19.    }  
  20.    printf( "Path created with _makepath_s: %s\n\n", path_buffer );  
  21.    err = _splitpath_s( path_buffer, drive, _MAX_DRIVE, dir, _MAX_DIR, fname,  
  22.                        _MAX_FNAME, ext, _MAX_EXT );  
  23.    if (err != 0)  
  24.    {  
  25.       printf("Error splitting the path. Error code %d.\n", err);  
  26.       exit(1);  
  27.    }  
  28.    printf( "Path extracted with _splitpath_s:\n" );  
  29.    printf( "  Drive: %s\n", drive );  
  30.    printf( "  Dir: %s\n", dir );  
  31.    printf( "  Filename: %s\n", fname );  
  32.    printf( "  Ext: %s\n", ext );  
  33. }  

 

我自己写了个合成当前EXE所在目录某个文件的完整路径函数:

  1. void make_full_path(char* s, int nLen, const char *file_name, const char*file_ext)  
  2. {  
  3.     char szPath[MAX_PATH]={0};  
  4.     GetModuleFileNameA(NULL, szPath, MAX_PATH);  
  5.     char cDir[100] = "";  
  6.     char cDrive[10] = "";  
  7.     char cf[20] = "";  
  8.     char cExt[10] = "";  
  9.     _splitpath_s(szPath, cDrive, cDir, cf, cExt);  
  10.     _makepath_s(s, nLen, cDrive, cDir, file_name, file_ext);  
  11. }  

 

  1. string GetExePath(void)  
  2. {  
  3.     char szFilePath[MAX_PATH + 1]={0};  
  4.     GetModuleFileNameA(NULL, szFilePath, MAX_PATH);  
  5.     (strrchr(szFilePath, '\\'))[0] = 0; // 删除文件名,只获得路径字串  
  6.     string path = szFilePath;  
  7.   
  8.     return path;  
  9. }  

 

参数说明:

s用来接收完整路径;

nLen缓冲区长度;

file_name为文件名称,不带后缀;

file_ext为文件后缀。

 

  1. FILE *f;  
  2. TCHAR szFilePath[MAX_PATH + 1]={0};  
  3. sprintf_s(szFilePath, "%s", g_file_in.c_str());  
  4. //GetModuleFileName(NULL, szFilePath, MAX_PATH);  
  5. (strrchr(szFilePath, '.'))[1] = 0;   
  6. sprintf_s(szFilePath, "%soutput.txt", szFilePath);  
  7.   
  8. fopen_s(&f, szFilePath, "a+");  
  9.   
  10. fwrite(strLog.c_str(), 1, strlen(strLog.c_str()), f);  
  11.   
  12. fclose(f);
<think>好的,我需要回答用户关于如何在Windows上用C++获取可执行文件的运行路径的问题。首先,我应该回想一下相关的Windows API函数。记得有几个函数可以获取模块的文件路径,比如GetModuleFileName和GetModuleHandle。 首先,GetModuleFileName函数可以用来获取当前进程的可执行文件路径。当传入NULL作为模块句柄时,它默认获取当前进程的路径。不过,返回的是完整路径,包括文件名。如果用户只需要目录部分,可能需要处理字符串,去掉文件名部分。 然后,可能需要使用到PathRemoveFileSpec这个函数,它属于Shlwapi库。这个函数可以移除路径中的文件名部分,只保留目录。需要注意的是,使用这个函数需要包含相应的头文件,比如shlwapi.h,并链接Shlwapi.lib库。 另外,用户可能关心Unicode和ANSI版本的问题。在Windows编程中,通常推荐使用Unicode版本,即GetModuleFileNameW,而ANSI版本是GetModuleFileNameA。为了通用性,可以使用TCHAR宏,根据编译设置自动选择字符集。 接下来,编写示例代码的大致步骤应该是:调用GetModuleFileName获取完整路径,然后使用PathRemoveFileSpec处理,得到目录路径。同时,需要处理可能的错误情况,比如函数调用失败的情况,这时候可以检查返回值是否为0,并调用GetLastError获取错误信息。 还要注意路径缓冲区的长度。根据文档,Windows路径的最大长度是MAX_PATH(260字符),但在某些情况下可能会更长,比如使用扩展长度路径前缀(\\?\)。为了安全起见,可能需要动态分配缓冲区或者使用循环来确保缓冲区足够大。不过,对于大多数情况,使用MAX_PATH大小的缓冲区应该足够。 另外,用户提到的引用中有关于.dll文件路径的处理,比如将依赖的.dll文件放在可执行文件同目录下。因此,正确获取可执行文件的路径对于配置运行时环境非常重要,这可能也是用户的需求背景。 还需要考虑跨版本兼容性,确保代码在不同版本的Windows上都能正常工作。GetModuleFileName是一个比较古老的API,应该兼容性很好。PathRemoveFileSpec可能需要注意是否在目标系统上可用,可能需要确认Shlwapi库的版本。 最后,测试代码是否能够正确获取路径。例如,在Visual Studio中编译时,调试模式和发布模式的可执行文件路径可能不同,需要确保代码能正确处理这些情况。 总结一下,解决这个问题的步骤包括使用GetModuleFileName获取完整路径,使用PathRemoveFileSpec去除文件名,处理可能的错误,并确保缓冲区足够大。同时,考虑到Unicode支持和库链接的问题,提供示例代码时需要注意这些细节。</think>在Windows系统中使用C++获取可执行文件的运行路径,可通过以下步骤实现: ### 方法步骤 1. **使用Windows API函数`GetModuleFileName`** 该函数可获取当前进程的可执行文件完整路径。语法如下: ```cpp DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); ``` - `hModule`: 传入`NULL`表示获取当前进程的路径 - `lpFilename`: 存储路径的缓冲区 - `nSize`: 缓冲区大小(建议设置为`MAX_PATH`) 2. **处理路径字符串** 若需仅保留目录路径(去除文件名),可使用`PathRemoveFileSpec`函数(需包含`<shlwapi.h>`并链接`Shlwapi.lib`): ```cpp #include <shlwapi.h> #pragma comment(lib, "Shlwapi.lib") ``` ### 示例代码 ```cpp #include <Windows.h> #include <shlwapi.h> #include <iostream> #pragma comment(lib, "Shlwapi.lib") int main() { TCHAR exePath[MAX_PATH]; DWORD pathLen = GetModuleFileName(NULL, exePath, MAX_PATH); if (pathLen == 0) { std::cerr << "Error: " << GetLastError() << std::endl; return 1; } // 移除文件名,保留目录路径 PathRemoveFileSpec(exePath); std::wcout << L"运行路径: " << exePath << std::endl; return 0; } ``` ### 注意事项 - **Unicode支持**:建议使用`TCHAR`和`GetModuleFileName`的宽字符版本(`GetModuleFileNameW`),以兼容长路径[^1] - **缓冲区大小**:若路径超过`MAX_PATH`,可改用动态分配缓冲区或循环扩展缓冲区 - **错误处理**:检查`GetModuleFileName`返回值是否为0,调用`GetLastError()`获取错误码[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值