目录
一、C++获取当前动态库所在的路径两种方式:
1、使用操作系统相关的API来实现
2、利用GetModuleFileNameA
二、读取配置文件
1、先了解下GetPrivateProfileString 读取配置信息
2、读取配置信息示例说明:
3、梳理集中类型获取值的示例
一、C++获取当前动态库所在的路径两种方式:
1、使用操作系统相关的API来实现
以下是在不依赖任何第三方库的情况下获取动态库路径的示例代码:
#ifdef _WIN32 // Windows平台#include <Windows.h>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 <dlfcn.h>
#include <unistd.h>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 <Windows.h>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 <tchar.h>//_Tusing 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);