admin 发表于 2024-7-26 08:25:07

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

目录

一、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;
    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 = {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,         // 如果没有找到指定的键名,则返回的默认值
LPTSTRlpReturnedString,    // 接收读取到的字符串的缓冲区
DWORD   nSize,               // 缓冲区大小
LPCTSTR lpFileName         // INI文件的路径
);
参数说明:

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

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

#include <tchar.h>//_T

using namespace std;

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

        LPCTSTR chConfig = strConfigFilePath.c_str();

        //从config.ini文件中读取节下的"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 = {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 longDWORD;
DWORD m_dwTime;
m_dwTime = (DWORD)::GetPrivateProfileIntA(_T("Setup"), _T("TTime"), 0, strConfigFilePath);
页: [1]
查看完整版本: C++获取当前exe或者 dll所在的路径,并读取配置文件