inf 与 ini 文件的配置与C++读取

INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚本以控制硬件操作。
 
INFI的功能
 
1 复制文件、删除文件、或重新命名文件。
2 新增或删除注册表(Registry)中的项目。
3 修改重要的系统设置文件(如 Autoexec.bat、Config.sys、.INI 等)
 
INF的规则
 
INF是纯文本文件,它是分节的,这点和INI文件类似,每节以"[]"扩起来,每一个节名最长为255个字符(Windows 2000/XP/2003操作系统中)或28个字符(Windows 98操作系统中)。在节与节之间的内容叫条目,每一个节又是由许多的条目组成的,每一个条目都由=分开,如a="b"。如果每一个条目的等号后有多个值,则每一个值之间用","号分隔开。INF对大小写不敏感,行注释语句命令是";",类似VB里的'。如果一行写不下,使用"/"来换行。
 
INF的运行
 
.INF文件是由Windows的SetupAPI解释执行的脚本文件,它的运行过程很简单,是一种线性的执行,线性的意思就是.INF文件的运行过程不存在分支语句,也就是没有条件语句,一旦开始执行,就是沿着固定的路线运行。它的运行是按照节为单位来执行的,从某一个[Install]节开始执行,从上到下执行该节中的条目,如果该条目是一个节,那么就一条条执行子节中的条目,如此递归执行。在WINDOW上运行只要右击这个文件,点击安装即可。
 

INF的语法结构
 
;指定版本和签名节
[VERSION]
;系统根据Signuture看是不是适合当前版本,如果适合的话就执行,否则不执行,当然强制安装是可以的
;用于WIN9X
Signature="$CHICAGO$"
;WINNT+
;Signature="$Windows NT$"
 
;指定安装文件布局
该行是可选的,如果没有提供布局信息文件,则在INF文件内必须包含[SourceDisksNames]和[SourceDisksFiles]节
LayoutFile=filename.inf
 
[SourceDisksNames]节 
[SourceDisksNames]节罗列源文件所在盘符序列码、盘描述符、盘卷标号和盘序列号。 
[SourceDisksNames]节内语句的语法为: 
disk-ordinal=“disk-description”,disk-label,disk-serial-number 
其中disk-ordinal为必选项,是盘符序列码,标识一个源盘,具有惟一性,一般可设置为从1开始递增的整数,0不是一个有效的盘符序列码。当存在多个源盘时,盘符序列码之间不能重复。 
disk-description为必选项,是盘描述符,用双引号括起的字符串或字符串宏描述盘的内容或目的。安装引擎将该字符串显示在对话框内以提示用户。 
disk-label为源盘的卷标识。 
disk-serial-number未使用,但必须被设置为0。 
[SourceDisksFiles]节 
[SourceDisksFiles]节指定安装时使用的源文件和盘符序列码、盘描述符。 [SourceDisksFiles]节内语句的语法为: 
file-name=disk-number[,subdir] [,file-size] 
其中file-name为必选项,是源盘上文件的名称。 
disk-number是包含file-name指定文件所在源盘的盘符序列码,该盘符序列码需在[SourceDisksNames]节中列出,并大于或等于1。 
Subdir为可选项,指定文件所在源盘的子目录,如省略则源盘为缺省安装路径。 
file-size为可选项,表明文件的大小,以字节为单位。
 

[DestinationDirs]
;指定CopyFiles、RenFiles或DelFiles入口的缺省操作目录
;语法file-list-section=LDID,[Subdir]
;LDID列表如下:
;01 ;current directory
;04 ;backup directory
;10 ;windows directory
;11 ;system dir
;12 ;iosubsys
;13 ;command
;14 ;control panel directory
;15 ;printers directory
;16 ;workgrou dir
;17 ;inf dir
;18 ;help dir
;19 ;administration dir
;20 ;fonts
;21 ;viewers
;22 ;vmm32
;23 ;color dir
;25 ;shared dir
;26 ;winboot
;28 ;host winboot
;30 ;root of boot drive
;31 ;root of host drive of a virtual boot drive
;32 ;old windows dir if exists
 

;以下例子为安装到window/web目录下
;DefaultDestDir=10,"web"
 
[Install]
提供了一个INF文件安装过程的总览,它识别文件内其他包含安装信息节的详细动作,是Windows内建安装函数识别安装过程和内容的真正入口[Install]
 
;[Install]节分[DefaultInstall]和[OtherInstall]两类
;[DefaultInstall]节节名DefaultInstall如前面表格内容所述被显式地在注册表中指定。
;该节也是系统获取INF文件中安装信息的首要入口,当用户右击INF文件选“安装”时该节内容被执行。
;[OtherInstall]与[DefaultInstall]节遵循相同的语法,但必须被显式地调用,常被用来定义反安装动作
 

;缺省安装节
[DefaultInstall]
 
;指明添加注册表的子节,等号后面的为自定义节名,例子见[add]节
ADDREG=add
 

;指明要删除的注册表子节,等号后面的为自定义节名
DELREG=del
 

;指明要要复制的文件子节,用于安装,Copyfiles命令可以替换系统正在访问的文件。这些功能通过普通的del和copy命令都无法实现
CopyFiles=cfile
 

;指明要要删除的文件子节,用于反安装,多个节以逗号隔开,该命令如果发现要删除的文件被锁定,就会把文件放到系统删除队列中排队
;等系统重启动的时候,该文件就自动被删除了
DelFiles=删除文件段
;[删除文件段]
;文件名列表
;例子:
;a.exe
;b.sys
 
;重命名文件段
RenFiles=重命名文件段
 
;[重命名文件段]
;语法:
;[file-list-section]
;new-file-name,old-file-name 
;file1,file2 ;修改文件名file1为file2
 

;更新INI文件段内容子节
UpdateInis = 更新INI文件段
 
;[更新INI文件段]
;ini-file, ini-section, [old-ini-entry], [new-ini-entry], [flags] 
;ini-file 包含要更改条目的 .ini 文件名
;ini-section 包含要更改条目的节名
;old-ini-entry 可选,常用形式为 Key=Value
;new-ini-entry 可选,常用形式为 
;Key=Value。flags 是可选操作标记
 
;例子
;%01%/wincmd.ini, Configuration,,"InstallDir=%01%"
;%01%/wincmd.ini, Configuration,,"Mainmenu=%01%/LANGUAGE/TCExtMenu.mnu"
 
;更新ini文件值内容
updateinifield =
 
;ini文件更新注册表
ini2reg=aa.ini
 
;更新config.sys内容
updatecfgsys=更新autoexec.bat段
 
[更新autoexec.bat段]
 
;更新autoexec.bat内容
updateautobat=更新autoexec.bat段
[更新autoexec.bat段]
 

;定义资源节,像资源文件,调用时使用%REG_SZ%就代表了0x00000000
[Strings]
REG_SZ=0x00000000
REG_BINARY=0x00000001
REG_DWORD=0x00010001
 
 
 
;自定义添加注册表项的节
[add]
 
;注意格式:HKEY(根键缩写),Subkey(子键),Valuename(键值名),Type(键值类型),Value(键值)
;HKCU -> HKEY_CURRENT_USER
;HKCR -> HKEY_CLASSES_ROOT
;HKLM -> HKEY_LOCAL_MACHINE
;HKU -> HKEY_USERS
;HKU -> HKEY_USERS
;HKCC -> HKEY_CURRENT_CONFIG
;HKDD -> HKEY_DYN_DATA
 
;解禁注册表编辑器
HKCU,Software/Microsoft/Windows/CurrentVersion/Policies/System,DisableRegistryTools,1,0
;解禁IE的Internet选项
HKCU,Software/Policies/Microsoft/Internet Explorer/Restrictions,NoBrowserOptions,1,0
;解禁IE的Internet选项里面的各个具体选项
HKCU,Software/Policies/Microsoft/Internet Explorer/Restrictions,NoBrowserOptions,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Settings,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,HomePage,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,GeneralTab,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Cache,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,History,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Colors,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Fonts,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Languages,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Accessibility,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,SecurityTab,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,SecChangeSettings,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,SecAddSites,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,ContentTab,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Ratings,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Certificates,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,CertifPers,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,CertifSite,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,CertifPub,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,FormSuggest,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,FormSuggest Passwords,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Wallet,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Profiles,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,ConnectionsTab,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Connection Wizard,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Connwiz Admin Lock,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Connection Settings,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Proxy,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,AutoConfig,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,ProgramsTab,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,ResetWebSettings,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Check_If_Default,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,AdvancedTab,1,0
HKCU,Software/Policies/Microsoft/Internet Explorer/Control Panel,Advanced,1,0
;解禁下载(可单独使用)
HKCU,Software/Microsoft/Windows/CurrentVersion/Internet Settings/Zones/3,1803,1,0
;自动修改IE标题栏文字、主页、搜索页等等
HKCU,Software/Microsoft/Internet Explorer/Main,Window Title,0,"Internet Explorer"
HKCU,Software/Microsoft/Internet Explorer/Main,Start Page,0," http://www.20cn.net"
HKCU,Software/Microsoft/Internet Explorer/Main,Search Page,0," http://www.20cn.net"
HKCU,Software/Microsoft/Internet Explorer/Main,Default_Page_URL,0," http://www.20cn.net"
HKLM,SOFTWARE/Microsoft/Internet Explorer/Main,Default_Search_URL,0," http://www.20cn.net"
HKLM,SOFTWARE/Microsoft/Internet Explorer/Main,Search Page,0," http://www.20cn.net"
HKLM,SOFTWARE/Microsoft/Internet Explorer/Main,Start Page,0," http://www.20cn.net"
HKLM,SOFTWARE/Microsoft/Internet Explorer/Main,Default_Page_URL,0," http://www.20cn.net"
HKLM,SOFTWARE/Microsoft/Internet Explorer/Main,Default_Page_URL,0," http://www.20cn.net"
 

[dfile]
;该节定义了将要删除的文件列表,filename后面的1是一个标志,指明如果文件当前无法删除,就等到系统重启动后删除。
;格式:filename,,,1
;例子:
a.exe,,,1

 

INI 文件的操作 

-------------------------------------------------------------------------------- 

概述 

在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置、大小、一些用户设置的数据等等,在 Dos 下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用。在 Win32 编程中当然你也可以这样干,但 Windows 已经为我们提供了两种方便的办法,那就是使用注册表或者 ini 文件(Profile)来保存少量数据。本文中先介绍一下 .ini 文件的使用。 

ini 文件是文本文件,中间的数据格式一般为: 
[Section1 Name] 
KeyName1=value1 
KeyName2=value2 
... 

[Section2 Name] 
KeyName1=value1 
KeyName2=value2 

ini 文件可以分为几个 Section,每个 Section 的名称用 [] 括起来,在一个 Section 中,可以有很多的 Key,每一个 Key 可以有一个值并占用一行,格式是 Key=value,Win32 对 ini 文件操作的 api 中,有一部分是对 win.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。Win.in 和 system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。由于 Win.ini 文件的重要性和常用性,Win32 中有专门对 Win.ini 进行操作的 api,它们是: 

GetProfileInt - 从 Win.ini 文件的某个 Section 取得一个 key 的整数值,它的原形是: 

GetProfileInt( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少 
); 

如果 Key 值没有找到的话,返回值是 nDefault 指定的缺省值,如果 Key 中的值是负数,则返回 0,如果 Key 指定的是数字和字符串的混合,则返回数字部分的值,比如说 x=1234abcd,则返回 1234 


GetProfileString - 从 Win.ini 文件的某个 Section 取得一个 key 的字符串,它的原形是: 

GetProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址 
LPTSTR lpReturnedString, // 返回字符串的缓冲区地址 
DWORD nSize // 缓冲区的长度 
); 

返回的字符串在缓冲区内,返回的 eax 值是返回的字符串的长度(不包括尾部的0) 


GetProfileSection - 从 Win.ini 文件中读出整个 Section 的内容,它的原形是: 

GetProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPTSTR lpReturnedString, // 返回数据的缓冲区地址 
DWORD nSize // 返回数据的缓冲区长度 
); 


WriteProfileSection - 将一个整个 Section 的值 写入 Win.ini 文件的指定 Section 中,它的原形是: 

WriteProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpString // 要写入的数据的地址 
); 

如果 Win.ini 没有指定的 Section,API 会新建立一个并写入数据,如果已经存在,则先删除原来 Seciton 中所有的 Key 值然后写入新的。 


WriteProfileString - 将一个 Key 值写入 Win.ini 文件的指定 Section 中,它的原形是: 

WriteProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpString // 要写的字符串地址 
); 

如果 Win.ini 没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。 
以上的 Api 是对 Win.ini 操作的,当然对于我们来说,用的更多的是在程序运行的目录中建立自己的 ini 文件,如果需要对自己的 ini 文件操作,就要用到另一组 Api,这一组 api 和上面的很象,只要把上面一组的 Profile 换成 PrivateProfile(私有的)就可以了,参数中也相应的多了一个 ini 文件名的参数。例如 GetPrivateProfileInt、GetPrivateProfileSection、WritePrivateProfileString 等等, 下面分别介绍: 

GetPrivateProfileInt - 从 ini 文件的某个 Section 取得一个 key 的整数值,它的原形是: 

GetPrivateProfileInt( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少 
LPCTSTR lpFileName // ini 文件的文件名 
); 

中间参数和返回值的定义和 GetProfileInt 是一样的。 


GetPrivateProfileString - 从 ini 文件的某个 Section 取得一个 key 的字符串,它的原形是: 

GetPrivateProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址 
LPTSTR lpReturnedString, // 返回字符串的缓冲区地址 
DWORD nSize // 缓冲区的长度 
LPCTSTR lpFileName // ini 文件的文件名 
); 


GetPrivateProfileSection - 从 ini 文件中读出整个 Section 的内容,它的原形是: 

GetPrivateProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPTSTR lpReturnedString, // 返回数据的缓冲区地址 
DWORD nSize // 返回数据的缓冲区长度 
LPCTSTR lpFileName // ini 文件的文件名 
); 

这个 api 可以读出整个 section 的内容,当你不知道 section 中有哪些 key 的时候,可以使用这个 api 将整个 section 读出后再处理。 


GetPrivateProfileSectionNames - 从 ini 文件中获得 Section 的名称,它的原形是: 

GetPrivateProfileSectionNames( 
LPTSTR lpszReturnBuffer, // 返回数据的缓冲区地址 
DWORD nSize // 返回数据的缓冲区长度 
LPCTSTR lpFileName // ini 文件的文件名 
); 

如果 ini 中有两个 Section: [sec1] 和 [sec2],则返回的是 'sec1',0,'sec2',0,0 ,当你不知道 ini 中有哪些 section 的时候可以用这个 api 来获取名称 


WritePrivateProfileSection - 将一个整个 Section 的内容入 ini 文件的指定 Section 中,它的原形是: 

WritePrivateProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpString // 要写入的数据的地址 
LPCTSTR lpFileName // ini 文件的文件名 
); 


WritePrivateProfileString - 将一个 Key 值写入 ini 文件的指定 Section 中,它的原形是: 

WritePrivateProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpString // 要写的字符串地址 
LPCTSTR lpFileName // ini 文件的文件名 
); 

如果 ini 中没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。当指定的 ini 也不存在的时候,API 会自动建立一个新的文件,所以使用 ini 的好处是我们不必为了保存少量的数据涉及到文件操作,就连查找文件是否存在的操作都不必要。 

使用要点: 

在我们实际使用的时候,用的最多的是 GetPrivateProfileString 和 WritePrivateProfileString,但在对自定义 ini 文件操作的时候要注意的是,如果 lpFileName 指定的文件没有路径的话,Api 会去 Windows 的安装目录去找而不会在当前目录找,但是每次用到 ini 函数要获取当前路径显然太麻烦了,这里有一个变通的办法,你只要在 ini 文件名前面加上 ./ 就可以了,比如说要对本目录下的 user.ini 操作,那么文件名就是 './user.ini' 这样显然比较方便。另外,当你要把一个 Key 清除的时候,可以使用把 lpString 指向一个空的字符串然后使用 WritePrivateProfileString。当你要把一个 section 的全部内容清空的时候,也不必把 key 一个个的清除,可以使用把 lpString 指向一个空的字符串然后使用 WritePrivateProfileSection。 

//

Desktop.ini文件作用:

Desktop.ini以隐藏形式存在与文件夹中,若没有可以用文本文件创建。它可以起到自定义文件夹显示方式的作用。

1.自定义文件夹图标
在Desktop.ini文件中添加如下语句即可,
[.ShellClassInfo]
IconFile=[可以是.dll,.exe,.ico文件]
IconIndex=[>=0的数字,图标在IconFile中的序号]

2.鼠标悬停在文件夹图标上时,自定义提示文字
添加语句
InfoTip=[要显示的文字]
类似图片的alt和链接的title

3.给文件夹添加背景图片
添加语句
[ExtShellFolderViews]
[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
IconArea_Image=[jpg,bmp格式的图片文件]

示例:

[{5984FFE0-28D4-11CF-AE66-08002B2E1262}]
PersistMonikerPreview=%WebDir%/classic.bmp
PersistMoniker=file://Folder Settings/Folder.htt
[ExtShellFolderViews]
{5984FFE0-28D4-11CF-AE66-08002B2E1262}={5984FFE0-28D4-11CF-AE66-08002B2E1262}
{BE098140-A513-11D0-A3A4-00C04FD706EC}={BE098140-A513-11D0-A3A4-00C04FD706EC}
[.ShellClassInfo]
ConfirmFileOp=0
[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
Attributes=1
IconArea_Image=Folder Settings/Background.jpg
IconArea_Text=0x00ff004f
IconArea_TextBackground=0x00FFFFff

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值