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[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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何能够对使用ShaderGraph开发的Shader使用SetTextureOffset和SetTextureScale方法

假设在ShaderGraph中的纹理的引用名称为"_BaseMap"&#xff0c;同时对这个"_BaseMap"纹理使用了采样的节点"SampleTexture2D"&#xff0c;然后该采样节点的uv接入的TilingAndOffset节点&#xff0c;此时的关键步骤是新建一个Vector4属性&#xf…

mac如何永久设置环境变量

1. 先将默认shell修改为bash mac修改默认shell为bash-CSDN博客 2. 修改环境变量 Mac中的环境变量介绍 Mac系统的环境变量&#xff0c;加载顺序为&#xff1a; /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc 当然/etc/profile和/etc/paths…

C++实现顺序栈的基本操作(扩展)

#include <stdio.h> typedef char ElemType; #define StackSize 100 /*顺序栈的初始分配空间*/ typedef struct { ElemType data[StackSize]; /*保存栈中元素*/int top; /*栈顶指针*/ } SqStack; void InitStack(SqStack &st) {st.top-1; } …

SSM整合(注解版)

SSM 整合是指将学习的 Spring&#xff0c;SpringMVC&#xff0c;MyBatis 进行整合&#xff0c;来进行项目的开发。 1 项目基本的配置类 1.1 Spring 配置类 这个配置类主要是管理 Service 中的 bean&#xff0c;controller 层的 bean 对象是 SpringMVC 管理的 package cn.ed…

案例研究|作为一家BI厂商,飞致云是如何人人使用DataEase的?

杭州飞致云信息科技有限公司&#xff08;以下简称为飞致云&#xff09;长期秉持“软件用起来才有价值&#xff0c;才有改进的机会”的核心价值观&#xff0c;以“为数字经济时代创造好软件”为使命&#xff0c;致力于成为中国数字化团队首选的通用工具软件提供商。在软件产品不…

编码器-解码器(seq-seq)

1. 背景 encoder-decoder和seq-seq模型可以解决输入与输出都是不定长序列的问题。它们都用到了两个循环NN&#xff0c;分别叫做编码器(用来分析输入序列)与解码器(用来生成输出序列)。 2. 编码器 把一个不定长的输入序列变换成一个定长的背景变量c&#xff0c;并在其中编码输入…

【文心一言实践】使用文心一言创建MYSQL表及实体模型和Mapper

本来想写一个Spring Batch 线程池使用不当形成死锁的代码案例&#xff0c;但是需要建一张表还要初始化大量数据&#xff0c;这时想起了文心一言&#xff0c;试用了一下&#xff0c;确实大幅提升了效率。 以下是使用文心一言编码构建表和实体和DAO层接口的实践&#xff1a; 问&…

大文件分片上传、分片进度以及整体进度、断点续传【前端原生、后端 Koa、Node 原生】(一)

分片&#xff08;500MB&#xff09;进度效果展示 效果展示&#xff0c;一个分片是 500MB 的 分片&#xff08;10MB&#xff09;进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页…

算法通关村——海量数据处理办法

从40个亿中产生一个不存在的整数 题目&#xff1a;给定一个输入文件&#xff0c;包含40亿个非负整数&#xff0c;请设计一个算法&#xff0c;产生一个不存在该文件中的整数&#xff0c;假设你由1GB的内存来完成任务。 用位图去存储大数据 在数据量很大时&#xff0c;采用位方…

数据结构学习笔记——广义表

目录 一、广义表的定义二、广义表的表头和表尾三、广义表的深度和长度四、广义表与二叉树&#xff08;一&#xff09;广义表表示二叉树&#xff08;二&#xff09;广义表表示二叉树的代码实现 一、广义表的定义 广义表是线性表的进一步推广&#xff0c;是由n&#xff08;n≥0&…

C++11(上)

统一的列表初始化 首先要说明&#xff1a; 这个列表初始化和类和对象那里的初始化列表不是一个概念. {} 初始化 在C98中, 标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定. 比如: C语言里面其实就是这样支持的, 所以可以认为C支持这样就是因为要兼容C. 在…

IDEA中也能用postman了?

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

.Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)

机缘 不知不觉,.NET8都已经面世,而我们一直还停留在.netframework4.5开发阶段,最近准备抽空研究一下.Net6,一是为了提高技术积累,一方面想着通过这次的学习,看有没有可能将老的FX版本替换到.Net6开发上,经过查找官方资料,对.Net6支持的系统版本做一个分享,方便大家后期…

数据库事务

Innodb引擎支持以事务的方式执行SQL&#xff0c;事务包含ACID四个特性&#xff0c;分别是原子性、一致性、隔离性和持久化。 原子性 原子性是指开启事务后&#xff0c;使用commit提交事务或rollback回滚事务&#xff0c;使事务内的多条修改语句同时成功或失败。 原子性是通过…

图中点的层次(图的BFS)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果从 1 号点无法走到 n 号点&#xff0c;输出 −1。 输入格式 第一行包含两个整数 n 和 m。 接…

C\C++ 获取最值

C C 语言的不同类型的最值可以在 limits.h 头文件里找到定义 #include <limits.h>int main() {printf("%d", INT_MAX); // 整数最大值printf("%d", INT_MIN); // 整数最小值 } C C 有模板&#xff0c;可以通过替换下面的 int 和 double&#xff…

SQL Sever 基础知识 - 限制行数

SQL Sever 基础知识 - 三、限制行数 三、限制行数第1节 OFFSET FETCH - 限制查询返回的行数1.1 OFFSET 和 FETCH 子句1.2 SQL Server OFFSET 和 FETCH 示例 第2节 SELECT TOP - 限制查询结果集中返回的行数或行的百分比2.1 SELECT TOP 子句2.2 PERCENT2.3 WITH TIES2.4 SELECT …

CocosCreator 面试题(十九) Cocos Creator 材质 shader 分别是什么?

一、Cocos Creator 材质是什么&#xff1f;有什么作用&#xff1f; 在Cocos Creator中&#xff0c;材质&#xff08;Material&#xff09;是用于定义和渲染游戏对象外观的一种组件。材质描述了对象的外观属性&#xff0c;如颜色、纹理、透明度、光照等&#xff0c;它们决定了对…

React全站框架Next.js使用入门

Next.js是一个基于React的服务器端渲染框架&#xff0c;它可以帮助我们快速构建React应用程序&#xff0c;并具有以下优势&#xff1a; 1. 支持服务器端渲染&#xff0c;提高页面渲染速度和SEO&#xff1b; 2. 自带webpack开发环境&#xff0c;实现即插即用的特性&#xff1b;…

ROS报错:RLException:Invalid roslaunch XML Syntax: mismatched tag:

运行roslaunch文件提示&#xff1a; RLException:Invalid roslaunch XML Syntax: mismatched tag: line 45&#xff0c; column 2 The traceback for the exception was written to the log file. j 解决办法&#xff1a; line45 行多了标签&#xff1a;</node> 另外…