WritePrivateProfileString

【勇芳软件工作室】汉化HomePreviousNext

WritePrivateProfileString函数将字符串复制到指定的初始化文件的指定部分。

此函数用于与16位基于Windows的应用程序兼容。基于WIn32的应用程序应该将初始化信息存储在注册表中。

BOOL WritePrivateProfileString(

LPCTSTR 【lpAppName】,//指向节名的指针
LPCTSTR 【lpKeyName】,//指向键名的指针
LPCTSTR 【lpString】,//指向要添加的字符串的指针
LPCTSTR 【lpFileName】//指向初始化文件名??的指针
); 

参数

【lpAppName】

指向一个以null结束的字符串,其中包含要复制字符串的部分的名称。如果该部分不存在,则创建它。该部分的名称与案例无关;字符串可以是大写和小写字母的任何组合。

【lpKeyName】

指向空字符串的字符串,其中包含与字符串关联的键的名称。如果该键在指定的部分不存在,则创建它。如果此参数为NULL,整个部分(包括该部分中的所有条目)将被删除。

【lpString】

指向要写入文件的以null结尾的字符串。如果此参数为NULL,则【lpKeyName】参数指向的键将被删除。

Windows 95:此平台不支持使用TAB(\\ t)字符作为此参数的一部分。

【lpFileName】

指向以空值终止的字符串,用于命名初始化文件。

返回值

如果函数成功将该字符串复制到初始化文件,则返回值不为零。

如果函数失败,或者如果它刷新最近访问的初始化文件的缓存版本,则返回值为零。要获取扩展错误信息,请调用GetLastError.

备注

Windows 95:

Windows 95保留WIN.INI的缓存版本,以提高性能。如果所有三个参数都为NULL,则该函数将刷新缓存。刷新缓存后,函数总是返回FALSE,无论刷新是成功还是失败。

初始化文件中的一个部分必须具有以下形式:

[section]
键串
.
.
.

如果【lpFileName】参数不包含文件的完整路径和文件名,WritePrivateProfileString将在Windows目录中搜索该文件。如果文件不存在,则此函数将在Windows目录中创建该文件。

如果【lpFileName】包含完整路径和文件名,并且该文件不存在,WriteProfileString将创建该文件。指定的目录必须已经存在。

Windows NT:

Windows NT将大多数.INI文件引用映射到注册表,使用以下注册表项下定义的映射:

HKEY_LOCAL_MACHINE\软件\微软\
Windows NT\CurrentVersion\IniFileMapping

Windows NT为IniFileMapping注册表项保留缓存。调用WritePrivateProfileStringW,所有参数的值设置为NULL将导致Windows NT刷新指定的.INI文件的IniFileMappingKey缓存。

Win32配置文件功能(Get/WriteProfile*Get/WritePrivateProfile*)使用以下步骤来定位初始化信息:

1.在注册表中的初始化文件的名称,说myfile.ini,在IniFileMapping下:

HKEY_LOCAL_MACHINE\软件\微软\
Windows NT\CurrentVersion\IniFileMapping\myfile.ini

2.查看【lpAppName】指定的部分名称。这将是myfile.ini下的命名值,或myfile.ini的子项,否则将不存在。

3.如果由【lpAppName】指定的段名称是myfile.ini下的命名值,则该值指定注册表中的哪个位置可以找到该部分的密钥。

4.如果【lpAppName】指定的部分名称是myfile.ini的子项,则该子项下的命名值将指定注册表中的哪个部分的键。如果您要查找的密钥不存在作为命名值,那么将会有一个未命名的值(显示为“< No Name >”),指定注册表中的默认位置,您将在其中找到密钥。

5.如果由【lpAppName】指定的段名称不存在作为命名值或myfile.ini下的子项,那么在我的文件下将会有一个未命名的值(如“< No Name >”)) .ini,它指定注册表中的默认位置,您可以在其中找到该部分的键。

6.如果没有myfile.ini的子项,或者没有条目名称的条目,那么在磁盘上查找实际的myfile.ini并读取其内容。

当查看注册表中指定其他注册表位置的值时,有几个前缀可以更改ini文件映射的行为:

! - 这个字符强制所有的写入都到磁盘上的注册表和.INI文件。

# - 当新用户在安装后首次登录时,此字符会使注册表值设置为Windows 3.1 .INI文件中的值。

@ - 如果在注册表中找不到所请求的数据,则此字符可防止任何读取到磁盘上的.INI文件。

USR: - 此前缀代表HKEY_CURRENT_USER,前缀后面的文本与该键相关。

SYS: - 此前缀代表HKEY_LOCAL_MACHINE \\ SOFTWARE,前缀后的文本与该键相关。

使用WritePrivateProfileStringW功能将.INI文件信息输入注册表的应用程序应遵循以下准则:

*确保系统上不存在指定名称的.INI文件。

*确保在注册表中有一个键条目指定.INI文件。此条目应位于路径HKEY_LOCAL_MACHINE \\\\ SOFTWARE \\\\ Microsoft \\\\ Windows NT \\\\ CurrentVersion \\\\ IniFileMapping下。

*为指定一个部分的.INI文件密钥项指定一个值。也就是说,应用程序必须指定一个部分名称,因为它将显示在.INI文件或注册表项中。这是一个例子:[My Section].

*对于系统文件,指定添加值的SYS。

*对于应用程序文件,在附加值中指定USR。这里是一个例子:“我的部分:USR:应用程序名称\\部分”。而且,由于USR表示在HKEY_CURRENT_USER下的映射,应用程序还应该创建一个HKEY_CURRENT_USER下的一个键,该键指定添加值中列出的应用程序名称。对于刚刚给出的例子,这将是“应用程序名称”。

*按照上述步骤,应用程序设置程序应调用WritePrivateProfileStringW,前三个参数设置为NULL,第四个参数设置为INI文件名。例如:

WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" );

*这样的一个调用使得.INI文件到注册表的映射在下一次系统重启之前生效。操作系统将映射信息重新读入共享存储器。安装应用程序后,用户将不必重新启动计算机,以便将来的应用程序调用可以看到.INI文件到注册表的映射。

以下示例代码说明了上述指导原则,并基于以下几个假设:

*有一个名为“应用程序名称”的应用程序。

*该应用程序使用名为“appname.ini”的.INI文件。

* .INI文件中有一个部分,我们想看起来像这样:

[Section1]

FirstKey = It all worked out okay.

SecondKey = By golly, it works.

ThirdKey = Another test.

*用户不必重新启动系统,以便将来调用应用程序可以看到.INI文件到注册表的映射。

以下是示例代码:

// a main function

#include < stdio.h >

#include < windows.h >

//一个主要功能

主要()

{

//局部变量

CHAR inBuf[80];

HKEY hKey1, hKey2;

DWORD dwDisposition;

LONG lRetCode;

//尝试创建.INI文件密钥

lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE,

“SOFTWARE \\\\ Microsoft \\\\ Windows NT

\\CurrentVersion\\IniFileMapping\\appname.ini",

0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,

NULL,& hKey1,

&dwDisposition);

//如果我们失败了,请注意并离开

if (lRetCode != ERROR_SUCCESS){

printf ("Error in creating appname.ini key\n");

return (0) ;

}

//尝试设置段值

lRetCode = RegSetValueEx ( hKey1,

“SECTION1”

0,

REG_SZ,

“USR:App Name \\\\ Section1”,

20);

//如果我们失败了,请注意并离开

if (lRetCode != ERROR_SUCCESS) {

printf ( "Error in setting Section1 value\n");

return (0) ;

}

//尝试创建一个应用程序名称键

lRetCode = RegCreateKeyEx ( HKEY_CURRENT_USER,

“应用名称”,

0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,

NULL,& hKey2,

&dwDisposition);

//如果我们失败了,请注意并离开

if (lRetCode != ERROR_SUCCESS) {

printf ("Error in creating App Name key\n");

return (0) ;

}

//强制操作系统将映射重新读取到共享内存中

//以便将来的应用程序调用将会看到它

//没有用户必须重新启动系统

WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" );

//如果我们到目前为止,一切顺利

//让我们写一些附加值

WritePrivateProfileString(“Section1”,“FirstKey”,

"It all worked out okay.", "appname.ini");

WritePrivateProfileString(“Section1”,“SecondKey”,

"By golly, it works.", "appname.ini");

WritePrivateProfileSection ("Section1", "ThirdKey = Another Test.",

"appname.ini");

//让我们来测试我们的工作

GetPrivateProfileString(“Section1”,“FirstKey”,

“伪造价值:没有工作”,inBuf,80,

"appname.ini");

printf ("%s", inBuf);

//好的,我们在这里

return(0);

}

也可以看看

GetPrivateProfileString, WriteProfileString