50.asp
来自「ASPWeb数据库范例总览」· ASP 代码 · 共 1,382 行 · 第 1/4 页
ASP
1,382 行
<P><FONT COLOR="#000080"><FONT SIZE=-1>Debug.Print "Name=" &
Name & ", " & ValueOutput( bArr, vType )</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Index = Index + 1</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>End If</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Loop Until Not ret</FONT></FONT></P>
</UL>
<P> </P>
<P><B>◆ SetDefaultValue 函数:写入Default Value</B></P>
<P> </P>
<P>SetDefaultValue 是与 GetDefaultValue 相对应的函数, 前者用来写入资料,
後者则是读取资料, 两者除了读取与写入的差别之外, 使用方法与参数定义则完全相同。</P>
<P> </P>
<P>比较值得注意的事情是, 当我们想写入某一个 Subkey 的 Default Value 时,
若此一 Subkey 不存在, 则 Windows 會自动建立此一 Subkey, 然後才写入 Default
Value, 假设 "HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry" Subkey
并不存在, 则以下叙述:</P>
<P> </P>
<UL>
<P><FONT SIZE=-1>ret = SetDefaultValue(HKEY_LOCAL_MACHINE, "SOFTWARE\kj\Registry",
"kj Registry Master")</FONT></P>
</UL>
<P> </P>
<P>會先建立以下两个 Subkey:(HKEY_LOCAL_MACHINE\SOFTWARE 为已存在的 Subkey)</P>
<P> </P>
<DIR>
<P>HKEY_LOCAL_MACHINE\SOFTWARE\kj</P>
<P>HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry</P>
<P> </P>
</DIR>
<P>然後才写入 "kj Registry Master" 到 "HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry"
Subkey 的 Default Value。</P>
<P> </P>
<P><B>◆ SetValue 函数:写入特定Value</B></P>
<P> </P>
<P>SetDefaultValue 用来写入 Default Value, 而 SetValue 则用来写入特定名称的
Value, 它的函数定义如下:</P>
<P> </P>
<DIR>
<P>Function SetValue(ByVal <B>hKey</B> As Long, ByVal <B>ValueName</B>
As String, ByVal <B>vType</B> As Long, <B>Value</B> As Variant, Optional
ByVal <B>lenValue</B> As Integer) As Boolean</P>
<P> </P>
</DIR>
<P>比较特别的参数是 Value 及 lenValue, 其中 Value 参数所定义的型别是 Variant(不定型),
表示可以接受任何型别的资料, 而 lenValue 参数则以 Optional 的方式来宣告,
表示可以省略。在使用上, 如果呼叫 SetValue 时所设定的是长整数或字串资料,
则 lenValue 参数可以省略, 因为长整数与字串都可以由程式自己取得长度(长整数的长度是
4, 字串的长度则是利用 Len(字串) 来取得), 因此只有设定 REG_BINARY 类型的资料时,
才需要设定 lenValue 参数, 以下是几种典型的呼叫方式:</P>
<P> </P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' REG_SZ </FONT>类型资料, <FONT SIZE=-1>Value
</FONT>参数传入字串</FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "String",
<B>REG_SZ</B>, "String Data")</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1> </FONT></FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' REG_DWORD </FONT>类型资料, <FONT SIZE=-1>Value
</FONT>参数传入长整数</FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "Dword",
<B>REG_DWORD</B>, 99999)</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1> </FONT></FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' </FONT>若是<FONT SIZE=-1> REG_MULTI_SZ
</FONT>类型资料, 需使用<FONT SIZE=-1> Chr(0) </FONT>将多个字串串起来</FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "MultiString",
<B>REG_MULTI_SZ</B>, "Str1"+Chr(0)+"Str2"+Chr(0) )</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' </FONT>以上三种呼叫方式均省略了<FONT SIZE=-1>
lenValue </FONT>参数</FONT></P>
</UL>
<P><FONT COLOR="#000080"> </FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' REG_BINARY </FONT>类型资料, <FONT SIZE=-1>Value
</FONT>参数应传入<FONT SIZE=-1> Byte </FONT>阵列, <FONT SIZE=-1>lenValue
</FONT>参数则传入资料长度</FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Dim bArr(0 To 20) As Byte</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "Binary",
<B>REG_BINARY</B>, bArr, 21)</FONT></FONT></P>
</UL>
<P> </P>
<P><B>◆ RegDeleteValue API:删除特定 Value</B></P>
<P> </P>
<P>除了笔者所提供的 Value 存取函数之外, 您可能还需要使用 API 函数中的
RegDeleteValue 来删除 Value, 此一函数很容易使用, 所以笔者不再提供封装版的
VB 函数, 它含有两个参数, 意义如下:</P>
<P> </P>
<DIR>
<P>(1) <B>ByVal hKey As Long</B>:Key Handle。</P>
<P>(2) <B>ByVal lpValueName As String</B>:Value 的名称, 若传入 "",
则表示删除 Default Value 的内容。</P>
<P> </P>
<P>若呼叫成功, 则函数传回 0, 与其他登录资料库 API 的惯例相同。</P>
<P> </P>
</DIR>
<H3 ALIGN=CENTER><U>存取</U> Value 的范例
<HR WIDTH="60%"></H3>
<P> </P>
<P>本段落最後让我们来参考一个比较完整的范例程式, 请开启下载档案中的 value.vbp
专案, 此一程式启动时, 會在 "HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry"
Subkey 底下写入以下 Value:</P>
<P> </P>
<CENTER><TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3 >
<TR>
<TD WIDTH="28%" VALIGN="TOP" BGCOLOR="#ffff00">资料类型</TD>
<TD WIDTH="19%" VALIGN="TOP" BGCOLOR="#ffff00">名称</TD>
<TD WIDTH="53%" VALIGN="TOP" BGCOLOR="#ffff00">资料</TD>
</TR>
<TR>
<TD WIDTH="28%" VALIGN="TOP"> </TD>
<TD WIDTH="19%" VALIGN="TOP"><FONT SIZE=+0>(</FONT>预设值<FONT SIZE=+0>)</FONT></TD>
<TD WIDTH="53%" VALIGN="TOP"><FONT SIZE=+0>kj Registry Master</FONT></TD>
</TR>
<TR>
<TD WIDTH="28%" VALIGN="TOP"><FONT SIZE=+0>REG_SZ</FONT></TD>
<TD WIDTH="19%" VALIGN="TOP"><FONT SIZE=+0>StringData</FONT></TD>
<TD WIDTH="53%" VALIGN="TOP">这是字串</TD>
</TR>
<TR>
<TD WIDTH="28%" VALIGN="TOP"><FONT SIZE=+0>REG_MULTI_SZ</FONT></TD>
<TD WIDTH="19%" VALIGN="TOP"><FONT SIZE=+0>MultiString</FONT></TD>
<TD WIDTH="53%" VALIGN="TOP">字串一<FONT SIZE=+0>(0) +</FONT>字串二<FONT SIZE=+0>+Chr(0)
+Chr(0)</FONT></TD>
</TR>
<TR>
<TD WIDTH="28%" VALIGN="TOP"><FONT SIZE=+0>REG_DWORD</FONT></TD>
<TD WIDTH="19%" VALIGN="TOP"><FONT SIZE=+0>LongData</FONT></TD>
<TD WIDTH="53%" VALIGN="TOP"><FONT SIZE=+0>99999</FONT></TD>
</TR>
<TR>
<TD WIDTH="28%" VALIGN="TOP"><FONT SIZE=+0>REG_BINARY</FONT></TD>
<TD WIDTH="19%" VALIGN="TOP"><FONT SIZE=+0>BinaryData</FONT></TD>
<TD WIDTH="53%" VALIGN="TOP"><FONT SIZE=+0>11 22 33 44 AA BB CC DD</FONT></TD>
</TR>
</TABLE></CENTER>
<P> </P>
<P>此时會使用到 SetDefaultValue 及 SetValue 函数, 接著当您按下「显示所有
Value」命令钮时, 如图-5, 程式會读出来所有 Value 并且显示在 ListBox 之中,
此时會呼叫 GetValueByIndex 函数。</P>
<P> </P>
<CENTER><P><A HREF="51-5.gif">图-5 存取 Value 的范例:value.vbp</A></P></CENTER>
<CENTER><P> </P></CENTER>
<P>最後当程式结束时, 则會删除以上所有的 Value, 此时會呼叫 GetValueByIndex
函数及 RegDeleteValue API 函数, 完整的程式如下:</P>
<P> </P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Private Sub Form_Load()</FONT></FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Dim hKey As Long, ret As Long</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetDefaultValue(HKEY_LOCAL_MACHINE,
"SOFTWARE\kj\Registry", "kj Registry Master")</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = RegOpenKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\kj\Registry", hKey)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "StringData",
REG_SZ, "这是字串")</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "MultiString",
REG_MULTI_SZ, "字串一" + Chr(0) + "字串二" + Chr(0))</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "LongData",
REG_DWORD, 99999)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, "BinaryData",
REG_BINARY, Array(&H11, &H22, &H33, &H44, &HAA, &HBB,
&HCC, &HDD), 8)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Call RegCloseKey(hKey)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>MsgBox "已写入资料到登录资料库中,
您可以开启 RegEdit 加以检查!"</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>End Sub</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1> </FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Private Sub Command1_Click() ' 显示所有
Value</FONT></FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Dim Index As Long, ret As Long,
hKey As Long</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Dim bArr() As Byte, Name As String,
vType As Long</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = RegOpenKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\kj\Registry", hKey)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = GetValueByIndex(hKey, Index,
Name, bArr, vType)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>While ret</FONT></FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>If Len(Name) = 0 Then Name = "(预
设 值)"</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>List1.AddItem Name & vbTab &
ValueOutput(bArr, vType)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Index = Index + 1</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = GetValueByIndex(hKey, Index,
Name, bArr, vType)</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Wend</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Call RegCloseKey(hKey)</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>End Sub</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1> </FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Private Sub Form_Unload(Cancel As
Integer)</FONT></FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Dim Index As Long, ret As Long,
hKey As Long</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Dim bArr() As Byte, Name As String,
vType As Long</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = RegOpenKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\kj\Registry", hKey)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = GetValueByIndex(hKey, Index,
Name, bArr, vType)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>While ret</FONT></FONT></P>
<UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Call RegDeleteValue(hKey, Name)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' 不可以执行 Index = Index + 1,
因为 Index = 0 的 Value 已删除, </FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' 後面的 Index 向前递减, 所以 Index
= 0 又可以读到 Value, </FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>' 其实在这一个 While 回圈中, 您可以将
Index 变数改成 0</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = GetValueByIndex(hKey, Index,
Name, bArr, vType)</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Wend</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>Call RegCloseKey(hKey)</FONT></FONT></P>
<P><FONT COLOR="#000080"><FONT SIZE=-1>MsgBox "kj\Registry 的 Value
已删除, 利用 RegEdit 检查时, 记得要先执行功能的「检视╱重新整理」!"</FONT></FONT></P>
</UL>
<P><FONT COLOR="#000080"><FONT SIZE=-1>End Sub</FONT></FONT></P>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?