精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VFP>>〖外部引用〗>>在VFP中操作Win95注册表和INI文件(转)

主题:在VFP中操作Win95注册表和INI文件(转)
发信人: nomean()
整理人: hunter__fox(2002-03-16 21:48:53), 站内信件
一、 利 用registry.prg 操 作Windows95 注 册 表 
---- 在 子 目 录 下 有 一 文 件registry.prg, 利 用 它 可 以 很 方 便 
地 操 作Windows95 注 册 表。 
---- 1 . 创 建 主 键 

---- 例 程DemoCreateKey 实 现 在HKEY_CURRENT_USER.0 下 创 建 主 键Opt1
。 

PROC demoCreateKey
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER
      -2147483647 && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("registry")
frmMyForm.init()
frmMyForm. OpenKey("Software.0",;
HKEY_CURRENT_USER,.T.)
ENDPROC
---- 2 . 检 查 一 个 主 键 是 否 存 在 
---- 例 程DemoCheckKey 检 查HKEY_CURRENT_USER.0 下 是 否 有 主 键Opt1,
 存 在 返 回 真, 否 则 返 回 假。 

PROC demoCheckKey
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER  -2147483647
  && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("registry")
frmMyForm.init()
if frmMyForm.IsKey("Software.0",;
HKEY_CURRENT_USER)
RETURN .T.
ELSE
RETURN .F.
ENDIF
ENDPROC
---- 2 . 创 建、 修 改 键 值 名 和 键 值 
---- 例 程RegKeyBinary 和RegKeyString 功 能 类 似, 不 同 之 处 在 于 
将 键 名DemoItem 的 值 设 置 为 二 进 制 值, 而 且 引 用 的 类 也 不 
同。 

PROC regkeybinary
* set value 00 00 01
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER -2147483647 
    && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("extregistry")
frmMyForm.init()
frmMyForm.SetRegKeyBinary
    ("DemoItem",chr(0)+chr(0)+chr(1),;
"Software.0",;
HKEY_CURRENT_USER)
ENDPROC
---- 3 . 创 建、 修 改 键 值 名 和 键 值 
---- 如 果HKEY_CURRENT_USER.0 下 不 存 在 键 值 名"DemoItem", 则 例 程
RegKeyString 创 建 它, 并 将 其 值 设 置 为 字 符 串"640"。 如 果 该 
键 值 名 已 存 在, 而 其 值 不 是 字 符 串"640", 则 将 其 修 改 为"6
40"。 

PROC regkeystring
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER  -2147483647
  && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("registry")
frmMyForm.init()
frmMyForm.SetRegKey("DemoItem","640",;
"Software.0",;
HKEY_CURRENT_USER)
ENDPROC
---- 4 . 读 取 键 值 
---- 例 程GetRegKeyString 读 取HKEY_CURRENT_USER.0 下DemoItem 的 值, 
并 将 其 存 放 于 内 存 变 量cValue 中。 

PROC getregkeyString
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER  -2147483647
   && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("registry")
frmMyForm.init()
cvalue=''
frmMyForm.GetRegKey("DemoItem",@cValue,;
"Software.0",;
HKEY_CURRENT_USER)
return cValue
ENDPROC
---- 5 . 枚 举 某 主 键 的 子 键 
---- 例 程DemoEnumOptionsName 枚 举HKEY_CURRENT_USER.0 下 的 子 键, 并
 放 入 一 维 数 组aRegOpts。 

PROC demoEnumOptionsName
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER  -2147483647
   && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("registry")
frmMyForm.init()
DIME aRegOpts[1]
frmMyForm. EnumOptions(@aRegOpts,;
"Software.0",HKEY_CURRENT_USER,.T.)
ENDPROC
---- 6 . 枚 举 某 主 键 下 各 键 名 及 其 键 值 
---- 例 程DemoEnumOptionsValue 枚 举HKEY_CURRENT_USER.0 下 各 键 名 及
 其 键 值, 并 放 入 二 维 数 组aRegOpts。 

PROC demoEnumOptionsValue
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER  -2147483647
   && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("registry")
frmMyForm.init()
DIME aRegOpts[1]
frmMyForm. EnumOptions(@aRegOpts,;
   "Software.0",HKEY_CURRENT_USER)
ENDPROC
---- 7 . 删 除 主 键 
---- 例 程DemoDeleteKey 删 除HKEY_CURRENT_USER.0 下 主 键Opt1。 

PROC demoDeleteKey
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER  -2147483647
   && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("registry")
frmMyForm.init()
frmMyForm. DeleteKey(HKEY_CURRENT_USER,;
"Software.0")
ENDPROC
二、 当 键 值 是 二 进 制 值 或DWORD 值 时 
---- 键 值 有 三 种 情 况, 可 能 是 字 符 串、 二 进 制 值 或DWORD 值
。 上 述3、4 两 个 例 程 只 适 用 于 键 值 是 字 符 串 的 情 况, 而 对
 于 二 进 制 值 或DWORD 值 的 情 况,registry.prg 未 提 供 解 决 方 案
, 曾 文 亦 仅 在 文 末 简 单 说 明" 上 面 的 例 子 只 描 述 了 键 值 
是 字 符 串 的 情 况", 至 于 键 值 是 二 进 制 值 或DWORD 值 的 情 况
 下 如 何 进 行 操 作 仍 不 得 而 知。 笔 者 翻 阅 了 大 量 资 料, 经
 过 摸 索, 解 决 了 这 一 问 题。 
---- 1 . 定 义registry 类 的 子 类extregistry, 并 将 其 放 在regist
ry.prg 中 ---- 例 程RegKeyDword 和RegKeyBinary 功 能 类 似, 不 同 之 
处 在 于 将 键 名DemoItem 的 值 设 置 为DWORD 值。 请 注 意 这 里 的 字
 节 顺 序 和 RegKeyBinary 中 设 置 二 进 制 值 时 字 节 顺 序 不 同, 
而 且 键 值 长 度 必 须 为 四 字 节, 否 则 也 不 能 正 确 设 置。 

PROC regkeydword
*set value 0x00000001 (1)
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER -2147483647 && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("extregistry")
frmMyForm.init()
frmMyForm.SetRegKeyDword("DemoItem", 
     chr(1)+chr(0)+chr(0)+chr(0),;
"Software.0",;
HKEY_CURRENT_USER)
ENDPROC
---- 3 . 读 取 键 值 
---- 例 程GetRegKeyBinary 和GetRegKeyString 功 能 类 似, 不 同 之 处 
在 于 前 者 用 于 读 取 二 进 制 键 值, 而 且 二 者 引 用 的 类 也 不
 同。 

---- 例 程GetRegKeyBinary 将 键 值 以 字 符 串 形 式 存 放 于cValue 中
, 此 字 符 串 可 能 包 含 不 可 显 示 字 符, 因 此 要 调 用 例 程toB
inaryChar 进 行 转 换, 并 把 结 果 存 放 于 字 符 型 内 存 变 量cRetV
alue 中, 可 以 用? cRetValue 命 令 输 出 到 屏 幕。 

PROC getregkeyBinary
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER -2147483647 
     && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("extregistry")
frmMyForm.init()
cvalue=''
frmMyForm.GetRegKeyBinary("DemoItem",@cValue,;
"Software.0",;
HKEY_CURRENT_USER)
length=LEN(m.cValue)
cRetValue=''
FOR i=1 TO length
cRetValue=cRetValue+tobinarychar
        (SUBS(m.cValue,i,1))+' '
ENDFOR
return cRetValue
ENDPROC
PROC toBinaryChar
LPARAMETER cchar
LOCAL nInt,nmod,bcbinarychar1,bcbinarychar2
ntemp=INT(ASC(cchar)/16)
STORE '' TO bcbinarychar1,bcbinarychar2
DO CASE
CASE ntemp=10
bcbinarychar1='a'
CASE ntemp=11
bcbinarychar1='b'
CASE ntemp=12
bcbinarychar1='c'
CASE ntemp=13
bcbinarychar1='d'
CASE ntemp=14
bcbinarychar1='e'
CASE ntemp=15
bcbinarychar1='f'
OTHERWISE
bcbinarychar1=STR(ntemp,1)
ENDCASE
nmod=ASC(cchar)-ntemp*16
DO CASE
CASE nmod=10
bcbinarychar2='a'
CASE nmod=11
bcbinarychar2='b'
CASE nmod=12
bcbinarychar2='c'
CASE nmod=13
bcbinarychar2='d'
CASE nmod=14
bcbinarychar2='e'
CASE nmod=15
bcbinarychar2='f'
OTHERWISE
bcbinarychar2=STR(nmod,1)
ENDCASE
RETURN bcbinarychar1+ bcbinarychar2
ENDPROC
---- 例 程GetRegKeyDword 和GetRegKeyBinary 功 能 类 似, 不 同 之 处 在
 于 前 者 用 于 读 取DWORD 值。 二 者 都 调 用 了 例 程toBinaryChar, 
但 转 换 字 节 的 先 后 顺 序 不 同。 
PROC getregkeydword
SET PROC TO registry
#DEFINE HKEY_CURRENT_USER  -2147483647 && BITSET(0,31)+1
frmMyForm = CREATEOBJECT("extregistry")
frmMyForm.init()
cvalue=''
frmMyForm.GetRegKeyDword("DemoItem",@cValue,;
"Software.0",;
HKEY_CURRENT_USER)
length=LEN(m.cValue)
cRetValue=''
FOR i=length TO 1 STEP -1
cRetValue=cRetValue+tobinarychar
        (SUBS(m.cValue,i,1))
ENDFOR
cRetValue='0x'+iif(LEN(cRetValue) >=8,cRetValue,;
REPLICATE('0',8-LEN(cRetValue))+cRetValue)
* cval 是 十 进 制 的
cVal=0
FOR i=1 TO length
cVal=cVal+ASC(SUBS(m.cValue,i,1))*256^(i-1)
ENDFOR
RETURN cRetValue+'('+STR(cVal)+')'
ENDPROC
三、 操 作INI 文 件 
---- 利 用registry.prg 不 仅 可 以 操 作Windows95 注 册 表, 还 可 以 
操 作INI 文 件, 如WIN.INI,WINFILE.INI 等。 
---- 1 . 读 取 某 节(SECTION) 下 所 有 键 名(Entries) 

---- 例 程DemoGetIniSection 读 取C:.INI 中 节Settings 下 所 有 键 名,
 并 将 之 存 放 于 数 组aSection 中。 

PROC demoGetIniSection
SET PROC TO registry
frmMyForm = CREATEOBJECT("oldinireg")
DIME aSections[1]
frmMyForm.GetINISection
     (@aSections,"SETTINGS",'C:.INI')
ENDPROC
---- 2 . 读 取 键 值 

---- 例 程DemoGetIniEntry 读 取C:.INI 中 节Windows 下 键 名 为Device 的
 键 值, 并 将 其 放 入 字 符 型 内 存 变 量cValue 中。 

PROC demoGetIniEntry
SET PROC TO registry
frmMyForm = CREATEOBJECT("oldinireg")
cValue=''
frmMyForm.GetINIEntry(@cValue,
   "WINDOWS","DEVICE",'C:.INI')
ENDPROC
---- 3 . 修 改 键 值 
---- 例 程DemoWriteIniEntry 将C:.INI 中 节Windows 下 键 名 为load 的 键
 值 修 改 为"notepad.exe"。 

PROC demoWriteIniEntry
SET PROC TO registry
frmMyForm = CREATEOBJECT("oldinireg")
frmMyForm.WriteINIEntry('notepad.exe',
    "WINDOWS","load",'C:.INI')
ENDPROC
---- 以 上 例 程 均 在Visual FoxPro5.0 和Windows95 环 境 下 调 试 通 过
。 

--
Life means nothing
Without the love you bring

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.109.248.188]

[关闭][返回]