利用GetPrivateProfileString读取配置文件(.ini)

利用GetPrivateProfileString读取配置文件(.ini)

我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入

配置文件中经常用到ini文件,在VC中其函数分别为:
写入.ini文件:bool WritePrivateProfileString(LPCTSTRlpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTRlpFileName);

读取.ini文件:DWORD GetPrivateProfileString(LPCTSTRlpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTRlpReturnedString,DWORD nSize,LPCTSTR lpFileName);

读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTRlpKeyName,INT nDefault,LPCTSTR lpFileName);

其中个参数的意思:
LPCTSTR lpAppName ------- INI文件中的一个字段名
LPCTSTR lpKeyName -------- lpAppName 下的一个键名,也就是里面具体的变量名
LPCTSTR lpString ---------是键值,也就是变量的值, 必须为LPCTSTR或CString类型
LPCTSTR lpFileName --------完整的INI文件路径名
LPCTSTR lpDefaut ----------如果没有其前两个参数值,则将此值赋给变量
LPSTR lpReturnedString --------接收INI文件中的值的CString对象,即接收缓冲区
DWORD nSize ------接收缓冲区的大小
例子:
CString StrName,Strtemp;
int nAge;
StrName = “jacky”;
nAge = 13;
WritePrivateProfileString(“Student”,“Name”,StrName,“c:\setting.ini”);
结果:(INI文件中显示如下:)
[Student]
Name=jacky
读取:
CString SName;
GetPrivateProfileString(“Student”,“Name”,“DefaultName”,SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,“c:\setting.ini”);
结果:SName =“jacky”;这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。
读整数比较简单,如下
int Result =GetPrivateProfileInt(“Student”,“nAge”,0,“c:\setting.ini”)返回值即为所读取的结果!
在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。
原代码如下:
CString server_ip;

CString des="";

::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));

des.ReleaseBuffer();

des+="\config.ini";
GetPrivateProfileString(“PhoneDemo”,“Server_IP”,"",server_ip.GetBufferSetLength(15),15,des);

server_ip.ReleaseBuffer();
注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作

例子:

CString StrName,Strtemp;

int nAge;

StrName = “jacky”;

nAge = 13;

WritePrivateProfileString(“Student”,“Name”,StrName,“c:\setting.ini”);

结果:(INI文件中显示如下:)

[Student]

Name=jacky

读取:

CString SName;

GetPrivateProfileString(“Student”,“Name”,“DefaultName”,SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,“c:\setting.ini”);

结果:SName =“jacky”;这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。

读整数比较简单,如下

int Result = GetPrivateProfileInt(“Student”,“nAge”,0,“c:\setting.ini”)返回值即为所读取的结果!

在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。

原代码如下:

CString server_ip;

CString des="";

::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));

des.ReleaseBuffer();

des+="\config.ini";
GetPrivateProfileString(“PhoneDemo”,“Server_IP”,"",server_ip.GetBufferSetLength(15),15,des);

server_ip.ReleaseBuffer();

注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作

更多说明:

获取路径

GetCurrentDirectory只是返回当前进程的当前目录,而并不是进程的镜像文件(.exe)所在的目录
GetCurrentDirectory()适用于XP等系统,在WinCE上不能使用
GetModuleFileName()适用于WinCE2.0以后

使用方法:

//下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录

{

CStringpath;

GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

path.ReleaseBuffer();

int pos =path.ReverseFind('\\');path =path.Left(pos);

}

GetModuleFileName函数

WINAPI DWORD GetModuleFileName(

HMODULE hModule,

LPWSTR lpFilename,

DWORD nSize

);

 GetBuffer和ReleaseBuffer是一套需要配合使用的函数,与GetBufferSetLength相比,优点是如果分配的空间大于实际保存的字符串(0结尾),

ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题:如果要保存的字符串为abc(0结尾),则GetBuffer参数应至少

为3; 如果要保存的内容不是以0结尾, 比如是读取文件数据,则GetBuffer参数如果大于文件长度时,ReleaseBuffer参数一定要为文件长度(如果

GetBuffer参数为文件长度的话不存在问题,ReleaseBuffer参数可以为默认-1)!

GetBufferSetLength相对比较容易理解, 它申请一个指定长度的空间,即使里面最终保存的字符串长度小于申请的空间长度, 也不会将多余空间释放.

__________________________________________________________________________________________________________________DWORDGetCurrentDirectory(

DWORD nBufferLength,

LPTSTR lpBuffer

);The GetCurrentDirectory function retrieves the current directoryfor the currentprocess.GetCurrentDirectory返回当前进程的当前目录,并不一定返回你的应用程序的目录。如果你在应用程序中调用了打开文件对话框,你选择了一个文件,那么,这个文件所在的目录就成了当前进程的当前目录了。Parameters

nBufferLength: 接收保存路径的字符串缓存长度, 缓存必须有一个保存结束的空字符的位置.

lpBuffer:指向接收字符串的缓存,收到的非空字符串指定了当前目录的绝对路径.

DWORD GetModuleFileName(

HMODULE hModule,

LPTSTR lpFilename,

DWORD nSize

);

GetModuleFileName 函数指定当前进程模块的路径.它仅仅操作当前进程下的模块.如果想获取其他进程下的模块信息, 则需使用GetModuleFileNameEx 函数.Parameters

hModule:模块的句柄,或者设置为NULL表示当前模块。

lpFilename:保存路径的缓冲区。

nSize:缓冲区的大小。

例子: TCHAR strExePath[_MAX_PATH];

GetModuleFileName(NULL,strExePath,_MAX_PATH);PathRemoveFileSpec(strExePath);如果当前执行程序的位置为c:\test.exe,GetModuleFileName获取的strExePath即为c:\test.ext,通过去掉名称函数最终获得的strExePath为c:。(注意PathRemoveFileSpec系统API函数调用时必须包含#include
"Shlwapi.h"作为头文件) TCHARstrExePath[_MAX_PATH];

GetCurrentDirectory(_MAX_PATH, strExePath);获取当前的系统目录,可能是c:也可能是其他值。


shlwapi.dll

shlwapi - shlwapi.dll - DLL文件信息

DLL 文件: shlwapi 或者 shlwapi.dll

DLL 名称: Microsoft Shell Light-weight Utility Library

描述:   shlwapi.dll是UNC和URL地址动态链接库文件,用于注册键值和色彩设置。

属于: Microsoft Windows Shell

系统 DLL文件: 是

常见错误: File Not Found, Missing File, Exception Errors

安全等级 (0-5): 0   间谍软件: 否   广告软件: 否

VC中使用GetModuleFileName获取应用程序路径

.\与API函数GetModuleFileName获取应用程序目录有何不一样?
采用.\也能获得应用程序目录,采用GetModuleFileName也能获得,二者有何不同?

一样!

一个是相对路径,一个是绝对路径
.\是得到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。
GetModuleFileName()得到模块的完整路径名,例如,你载入c:\windows\system32\a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。

.\一般用在包含头文件的语句中。

另一个是程序编译后起作用的,例如,打开自定义的配置文件等。

如何去取得这个Hanlde?

如果你直接用LoadLibrary()或AfxLoadLibrary()载入dll,该函数返回值就是handle;

如果你隐式载入dll, 用GetModuleHandle(“dll文件名”)也可以得到handle;

MFC程序得到本身路径

在开发工程中,往往需要知道当前程序本身所在目录。

一种方法是在程序安装的时候利用安装程序把文件路径写入注册表。在较大的程序中,这种方法比较常用

另一种,就是在程序得到路径。这样,程序随便移动到哪里,都可以得到正确的路径。这也是本文介绍的方法。

方法一:

[code]

//得到帮助文件的路径

CString strFullName = AfxGetApp()->m_pszHelpFilePath;

//得到的是:X:\XXXX\XXX.hlp

//解析路径,得到当前运行程序所在目录

char drive[_MAX_DRIVE];

char dir[_MAX_DIR];

_splitpath(strAppName,drive, dir, NULL,NULL);
CString strPath;

strPath.Format("%s%s", drive, dir);

//strPath即为得到的当前运行程序所在目录

[/code]

另外,AfxGetApp()->m_pszAppName得到应用程序名称
AfxGetApp()->m_pszExeName得到程序文件名,不包括扩展名

方法二:

得到全路径

TCHAR exeFullPath[MAX_PATH]; // MAX_PATH

GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模块名称,全路径

也就是当前运行程序的全路径

利用方法一的解析路径的方法,即可得到程序所在路径。

GetModuleFileName函数原型

DWORD GetModuleFileName(

HMODULEhModule, // handle to module。将要得到的模块的句柄。如果是当前模块,NULL

LPTSTRlpFilename, // pathbuffer 得到的文件名。

DWORDnSize) // size of buffer 一般MAX_PATH就可以了

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

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

相关文章

TQ210——S5PV210启动过程

TQ210——S5PV210启动过程 1、S5PV210内存地址映射 S5PV210 含有一个大小为64KB的IROM,起始地址为0xD0000000,结束地址为0xD000FFFF;含有一个大小为96KB的 IRAM,起始地址为0xD0020000,结束地址为0xD0037FFF;内存起始地…

心情不能平静了

突然之间,心情不能平静了,是什么滋味?恩,不好说,就是坐立都不是,屋里转了转不行又去外边转了趟,结果还是心潮澎湃.............很久很久没有这种感觉了,或许现在才叫活着吧,挺喜欢这种生活,从要改变自己的人生开始0(10月7日)到今天(10月25),算了下才18天,呵呵半个月真的发生了…

composer-安装插件包

上一步完成后,选定国内镜像地址,以为下载插件包做准备 https://pkg.phpcomposer.com/ 安装完componser后使用下面这条命令即可(设置国内镜像地址): composer config -g repo.packagist composer https://packagist.phpcomposer.com 插件包地址…

_tcstod()

http://www.cppfans.com/cbknowledge/reference/cstdlib/strtod.asp

555定时器是如何被发明的?

在电子领域中, 555 定时器集成芯片[1] 是著名集成芯片之一。然而很多人并不知道它是如何被发明的?下面是发表在网站 Circuit Today上的一篇文章[2] ,带你重温从555被发明开始直到当今的发展历程。一、什么是555定时集成芯片?555芯…

TQ210——交叉编译器的安装

TQ210——交叉编译器的安装 1、 下载arm-linux-交叉工具链 2、 在ubuntu下新建一个目录,通过Samba拖到虚拟机ubuntu中 3、由于刚创建的目录没有samba权限,因此要加权限。 4、解压交叉工具连,-C指定目录 5、用arm-linux-gcc–v查看版本&#…

CCCC L1-002. 打印沙漏【图形打印】

L1-002. 打印沙漏 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ************ *****所谓“沙漏形状”,是指每行输出奇数个符号&am…

Samsung原版44B0X的Bootloader分析

原作者:BCbbs 1.中断向量表 AREA Init,CODE,READONLY 说明: 1.从代码看Init段就是要写入0x00地址的原始中断向量,因此把这个文件编译生成的44binit.O和Init填入ADS的Linker-Layout页对应项中(这样编译器会把该段代码编译到0X…

C语言,把指针按地上摩擦,爽

不要陷在指针里面,最好的方法是跳出指针,我们从最终结果来思考问题。于是我的解题思路总是很偏,但是直指本质。我们写一段代码:编译,反编译,反编译这里我们用objdump -d hello >1.txt,如果你…

MFC CStringArray 字符串数组类 使用方法

https://blog.csdn.net/thanklife/article/details/76836487

C语言总结

C语言高级部分 一、内存大话题1.0、内存就是程序的立足之地,体现内存重要性。1.1、内存理解:内存物理看是有很多个Bank(就是行列阵式的存储芯片),每一个Bank的列就是位宽 ,每一行就是Words,则存…

嵌入生活的嵌入式,超市里的电子价签

纸质价签 VS 电子价签快过年了,今天特意走访了居住地附近的2家超市,不过不是为了买年货,而是为了给这篇文章提供一手的素材。今天我们来聊聊超市里的电子价签。我去的第一家超市,货架上的标签是这样的,这也是我们最常见…

Linux 移除python Error: Trying to remove “yum”, which is protected

>yum intall python >yum -y remove python 出现Error: Trying to remove "yum", which is protected 移除 >rpm -e --nodeps python转载于:https://www.cnblogs.com/eason-d/p/8589037.html

计算t-test 的C程序

/*gdb output 程序还未调试成功:http://ubuntuforums.org/archive/index.php/t-412096.html*//*(gdb) run Starting program: /home/nrh1/code/testt Program received signal SIGSEGV, Segmentation fault. 0x0804967f in var () *//*function to calculate tt…

CListCtrl::InsertColumn()和InsertItem()和SetItemText()

https://blog.csdn.net/qq_25821067/article/details/47095363 InsertColumn() 函数功能:在报告模式下插入一列 函数原型:int InsertColumn(int nCol, const LVCOLUMN* pColumn); int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, in…

张一鸣:大学四年收获及工作感悟

大学里的三点收获2001年我考入了南开大学,起初大学的生活是让人有点失落的,但慢慢地从安静朴素的校园和踏实努力的氛围中,我还是找到了自己的节奏。大学期间我主要在做三件事情 ,一是写代码,因为我是搞技术的&#xff…

C语言实现x的n次方

C语言实现x的n次方#include <stdio.h> // codeblock编辑和编译的#define uint8_t unsigned char #define uint32_t unsigned int #define POWER 16// 求x的n次方&#xff0c;返回x的n次方的值 uint32_t Power(uint8_t x, uint8_t n) {uint8_t i;uint32_t val 1;for(i …

十天内提高单词量到20000! (Vocabulary 10000)

<<Vocabulary 10000>> Lesson 1 A monument was built to commemorate the victory. 一个纪念碑被兴建以记念那场胜利 The children huddled together for warmth. 孩子们卷缩在一起来获得温暖 Censure is sometimes harder to bear than punishment. 有时候忍…

关于JTAG,你知道的和不知道的都在这里

01JTAG简介JTAG&#xff08;JointTest ActionGroup&#xff09;是一个接口&#xff0c;为了这个接口成立了一个小组叫JTAG小组&#xff0c;它成立于1985年。在1990年IEEE觉得一切妥当&#xff0c;于是发布了IEEE Standard 1149.1-1990&#xff0c;并命名为Standard Test Access…

GPS NEMA 0183协议

GPS NEMA 0183协议 一、 NMEA0183标准语句(GPS常用语句) $GPGGA 例&#xff1a;$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F 字段0&#xff1a;$GPGGA&#xff0c;语句ID&#xff0c;表明该语句为GlobalPositioning System Fix Data&#xff08;G…