C++获取当前exe或者 dll所在的路径,并读取配置文件

目录

一、C++获取当前动态库所在的路径两种方式:

1、使用操作系统相关的API来实现

2、利用GetModuleFileNameA

二、读取配置文件

1、先了解下GetPrivateProfileString 读取配置信息

2、读取配置信息示例说明:

3、梳理集中类型获取值的示例


一、C++获取当前动态库所在的路径两种方式:

1、使用操作系统相关的API来实现

以下是在不依赖任何第三方库的情况下获取动态库路径的示例代码:


#ifdef _WIN32  // Windows平台


#include 

std::string GetDynamicLibraryPath()
{
    HMODULE hModule = GetModuleHandle(NULL);
    char path[MAX_PATH];
    GetModuleFileName(hModule, path, MAX_PATH);
    std::string fullPath(path);
    size_t pos = fullPath.find_last_of("\\/");
    return fullPath.substr(0, pos);
}

#elif __linux__  // Linux平台


#include 
#include 

std::string GetDynamicLibraryPath()
{
    Dl_info dlInfo;
    dladdr((void*)GetDynamicLibraryPath, &dlInfo);
    char* path = realpath(dlInfo.dli_fname, NULL);
    std::string fullPath(path);
    free(path);
    size_t pos = fullPath.find_last_of("/");
    return fullPath.substr(0, pos);
}

#else

#error Unsupported platform

#endif

上述代码根据不同的操作系统平台,分别使用了Windows和Linux平台的API来获取动态库的路径。

在Windows平台上,我们使用GetModuleHandle函数获取当前模块的句柄,然后使用GetModuleFileName函数获取模块文件的完整路径。最后,通过对路径字符串的处理,获取动态库所在的目录路径。

在Linux平台上,我们使用dladdr函数获取当前函数的信息,包括动态库的路径。然后,通过调用realpath函数将路径转换为绝对路径,并进行相应的处理,获取动态库所在的目录路径。

请注意,上述代码只是一个简单的示例,实际情况可能会更加复杂。在实际使用中,你可能需要根据具体的需求和操作系统平台进行适当的调整和处理。

2、利用GetModuleFileNameA
using namespace std;

string getModulePath()
{
	char szDir[2048] = {0};
	::GetModuleFileNameA(NULL, szDir, sizeof(szDir));

	string strResult = szDir;
	strResult = strResult.substr(0, strResult.find_last_of("\\"));
	return strResult;
}

二、读取配置文件

1、先了解下GetPrivateProfileString 读取配置信息

GetPrivateProfileString是一个Windows API函数,用于从INI文件中读取配置信息。

它的用法如下:

#include 

DWORD GetPrivateProfileString(
  LPCTSTR lpAppName,           // 指定要读取的节名
  LPCTSTR lpKeyName,           // 指定要读取的键名
  LPCTSTR lpDefault,           // 如果没有找到指定的键名,则返回的默认值
  LPTSTR  lpReturnedString,    // 接收读取到的字符串的缓冲区
  DWORD   nSize,               // 缓冲区大小
  LPCTSTR lpFileName           // INI文件的路径
);

参数说明:

  • lpAppName:要读取的节名,即INI文件中方括号内的内容。
  • lpKeyName:要读取的键名,即INI文件中等号左边的内容。
  • lpDefault:如果没有找到指定的键名,则返回的默认值。
  • lpReturnedString:接收读取到的字符串的缓冲区。
  • nSize:缓冲区大小,即接收读取到的字符串的最大长度。
  • lpFileName:INI文件的路径。

返回值:

  • 返回实际读取到的字符串的长度(不包括结尾的空字符)。
2、读取配置信息示例说明:

#include //_T

using namespace std;

void test()
{
	// 通过上面接口getModulePath,获取当前的路径,并拼接上具体配置文件名字
	string strConfigFilePath= getModulePath() + "\\Config.ini";
	TCHAR buffer[200] = { 0 };
	DWORD bufferSize = sizeof(buffer) / sizeof(TCHAR);

	LPCTSTR chConfig = strConfigFilePath.c_str();

	//从config.ini文件中读取[Section]节下的"Key"键对应的值
	DWORD bytesRead = GetPrivateProfileString(
		_T("Log"),   // 节名
		_T("addLog"),       // 键名
		_T("1"),          // 默认值
		buffer,          // 接收读取到的字符串的缓冲区
		bufferSize,      // 缓冲区大小
		chConfig // INI文件路径
	);

	if (bytesRead > 0)
	{
		printf("成功读到配置文件");
	}
	else
	{
		printf("未找到指定的键名,使用默认值");
	}

	string addLog = buffer;
}

// 或者使用CString
void fun()
{
    CString strConfigFilePath; 
    strConfigFilePath.Format(_T("%s\\%s"), getModulePath(), _T("Config.ini"));
    m_bSaveLog  = (BOOL)::GetPrivateProfileIntA(_T("Log"), _T("Save"), 0, strConfigFilePath)
}

3、梳理集中类型获取值的示例
// 1、获取配置文件的字符串
TCHAR szTemp[256] = {0};
::GetPrivateProfileString(_T("Setup"), _T("Virtual"), _T("4412"), szTemp, 256, strConfigFilePath);

// 2、获取bool值
bool m_bSave;
m_bSave  = (BOOL)::GetPrivateProfileIntA(_T("Log"), _T("Save"), 0, strConfigFilePath);

// 3、获取int值
int m_iSaveDays;
m_iSaveDays = ::GetPrivateProfileIntA(_T("Log"), _T("DeleteSaveDays"), 60, strConfigFilePath)

// 4、获取DWORD值:typedef unsigned long  DWORD;
DWORD m_dwTime;
m_dwTime = (DWORD)::GetPrivateProfileIntA(_T("Setup"), _T("TTime"), 0, strConfigFilePath);

你可能感兴趣的:(C/C++,c++,开发语言,exe或者,dll所在的路径,读取配置信息)