50.asp

来自「ASPWeb数据库范例总览」· ASP 代码 · 共 1,382 行 · 第 1/4 页

ASP
1,382
字号

<P><FONT COLOR="#000080"><FONT SIZE=-1>Debug.Print &quot;Name=&quot; &amp;
Name &amp; &quot;, &quot; &amp; 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, 假设 &quot;HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry&quot; Subkey
并不存在, 则以下叙述:</P>

<P> </P>

<UL>
<P><FONT SIZE=-1>ret = SetDefaultValue(HKEY_LOCAL_MACHINE, &quot;SOFTWARE\kj\Registry&quot;,
&quot;kj Registry Master&quot;)</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>然後才写入 &quot;kj Registry Master&quot; 到 &quot;HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry&quot;
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, &quot;String&quot;,
<B>REG_SZ</B>, &quot;String Data&quot;)</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, &quot;Dword&quot;,
<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, &quot;MultiString&quot;,
<B>REG_MULTI_SZ</B>, &quot;Str1&quot;+Chr(0)+&quot;Str2&quot;+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, &quot;Binary&quot;,
<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 的名称, 若传入 &quot;&quot;,
则表示删除 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
专案, 此一程式启动时, 會在 &quot;HKEY_LOCAL_MACHINE\SOFTWARE\kj\Registry&quot;
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,
&quot;SOFTWARE\kj\Registry&quot;, &quot;kj Registry Master&quot;)</FONT></FONT></P>

<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = RegOpenKey(HKEY_LOCAL_MACHINE,
&quot;SOFTWARE\kj\Registry&quot;, hKey)</FONT></FONT></P>

<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, &quot;StringData&quot;,
REG_SZ, &quot;这是字串&quot;)</FONT></FONT></P>

<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, &quot;MultiString&quot;,
REG_MULTI_SZ, &quot;字串一&quot; + Chr(0) + &quot;字串二&quot; + Chr(0))</FONT></FONT></P>

<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, &quot;LongData&quot;,
REG_DWORD, 99999)</FONT></FONT></P>

<P><FONT COLOR="#000080"><FONT SIZE=-1>ret = SetValue(hKey, &quot;BinaryData&quot;,
REG_BINARY, Array(&amp;H11, &amp;H22, &amp;H33, &amp;H44, &amp;HAA, &amp;HBB,
&amp;HCC, &amp;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 &quot;已写入资料到登录资料库中,
您可以开启 RegEdit 加以检查!&quot;</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,
&quot;SOFTWARE\kj\Registry&quot;, 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 = &quot;(预
设 值)&quot;</FONT></FONT></P>

<P><FONT COLOR="#000080"><FONT SIZE=-1>List1.AddItem Name &amp; vbTab &amp;
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,
&quot;SOFTWARE\kj\Registry&quot;, 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 &quot;kj\Registry 的 Value
已删除, 利用 RegEdit 检查时, 记得要先执行功能的「检视╱重新整理」!&quot;</FONT></FONT></P>
</UL>

<P><FONT COLOR="#000080"><FONT SIZE=-1>End Sub</FONT></FONT></P>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?