目录
一、C++获取当前动态库所在的路径两种方式:
1、使用操作系统相关的API来实现
2、利用GetModuleFileNameA
二、读取配置文件
1、先了解下GetPrivateProfileString 读取配置信息
2、读取配置信息示例说明:
3、梳理集中类型获取值的示例
以下是在不依赖任何第三方库的情况下获取动态库路径的示例代码:
#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
函数将路径转换为绝对路径,并进行相应的处理,获取动态库所在的目录路径。
请注意,上述代码只是一个简单的示例,实际情况可能会更加复杂。在实际使用中,你可能需要根据具体的需求和操作系统平台进行适当的调整和处理。
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;
}
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文件的路径。返回值:
- 返回实际读取到的字符串的长度(不包括结尾的空字符)。
#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)
}
// 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);