C++ - 跨平台在Windows、Linux系统上获取当前可执行程序路径
1 C++跨平台在Windows、Linux系统上获取当前可执行程序路径
跨平台获取当前可执行程序路径是C++跨平台项目中会经常使用的功能,我将这个功能简单的封装成了一个PathUtils
工具类,在该类中通过GetCurrentProgramDirectory
静态函数获取当前可执行程序路径,下面贴出了功能实现代码。
path_utils.h
#ifndef _PATH_UTILS_H_
#define _PATH_UTILS_H_
#include <string>
class PathUtils
{
public:
// 得到当前程序执行路径
static std::string GetCurrentProgramDirectory();
};
#endif // !_PATH_UTILS_H_
path_utils.cpp
#include "path_utils.h"
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
#include<Windows.h>
#elif defined(linux) || defined(__linux)
#include <string.h>
#include <unistd.h>
#include <dlfcn.h>
#endif // WINDOWS
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
static HMODULE GetSelfModuleHandle()
{
MEMORY_BASIC_INFORMATION mbi;
return (
(::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0)
? (HMODULE)mbi.AllocationBase : NULL
);
}
std::string PathUtils::GetCurrentProgramDirectory()
{
std::string strCurrentPath = "";
char curDirector[260] = { 0 };
GetModuleFileName(GetSelfModuleHandle(), curDirector, 260);
strCurrentPath = curDirector;
size_t nameStart = strCurrentPath.rfind("\\");
strCurrentPath = strCurrentPath.substr(0, nameStart + 1);
return strCurrentPath;
}
#elif defined(linux) || defined(__linux)
std::string PathUtils::GetCurrentProgramDirectory()
{
std::string strCurrentPath = "";
char szCurWorkPath[256];
memset(szCurWorkPath, '\0', 256);
int nRet = readlink("/proc/self/exe", szCurWorkPath, 256);
if (nRet > 256 || nRet < 0)
{
return strCurrentPath;
}
for (int i = nRet; i > 0; i--)
{
if (szCurWorkPath[i] == '/' || szCurWorkPath[i] == '\\')
{
szCurWorkPath[i] = '\0';
break;
}
}
strCurrentPath = szCurWorkPath;
return strCurrentPath;
}
#endif
测试代码
#include <iostream>
#include "path_utils.h"
int main()
{
std::cout << "Path : " << PathUtils::GetCurrentProgramDirectory() << std::endl;
return 0;
}
如果有兴趣可以访问我的个人博客:https://www.stubbornhuang.com/