天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 51|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    昨天 15:13
  • 签到天数: 153 天

    [LV.7]常住居民III

    3456

    主题

    553

    回帖

    214748万

    积分

    管理员

    中国膜结构网www.mjgou.com

    积分
    2147483647
    QQ
    发表于 2024-7-26 08:25:07 | 显示全部楼层 |阅读模式
    目录

    一、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>//_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++获取当前exe或者 dll所在的路径,并读取配置文件
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池| |网站地图

    GMT+8, 2024-9-8 09:29 , Processed in 0.059387 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表