📄 025.htm
字号:
<p>finally</p>
<p>SetPasswordForm.Free;</p>
<p>end;</p>
<p>end;</p>
<font face="宋体" lang="ZH-CN"><p> 口令成功设置,把</font>PassWord<font
face="宋体" lang="ZH-CN">的值拷贝给</font>PWord<font face="宋体" lang="ZH-CN">输出,并返回</font>True<font
face="宋体" lang="ZH-CN">。应该注意的是由于</font> PWord<font face="宋体"
lang="ZH-CN">本身就是指针类型,指向一个字符串的地址,因而虽然</font>PWord<font
face="宋体" lang="ZH-CN">用于输出,但在参数表中仍为传值参数,而不是传址参数。另外调用函数</font>StrCopy<font
face="宋体" lang="ZH-CN">,要求</font>PWord<font face="宋体" lang="ZH-CN">在传入前已分配内存,否则会导致一个一般保护错。</font>try...finally<font
face="宋体" lang="ZH-CN">用于保护窗口所占用内存资源在任何情况下都能正常释放,读者可参看第十二章。</p>
<p> 在口令设置窗口中,为了确保用户记住了设置的口令,在用户输入并按回车键后,要求用户再次输入进行确认。只有用户重新输入的字符串与原设置口令相同,口令设置窗口才能正常关闭</font>
<font face="宋体" lang="ZH-CN">。否则将原设置口令清空,要求用户再次输入。以上功能的实现在编辑框的</font>OnKeyPress<font
face="宋体" lang="ZH-CN">事件处理过程中。 </p>
</font><p>procedure TSetPassWordForm.Edit1KeyPress(Sender: TObject; var Key: Char);</p>
<p>begin</p>
<p>if Edit1.text = '' then Exit;</p>
<p>if Key = #13 then</p>
<p>begin</p>
<p>if Verified then</p>
<p>if StrPas(PassWord) = Edit1.text then</p>
<p>begin</p>
<p>OKBtn.Enabled := True;</p>
<p>Edit1.Enabled := False;</p>
<p>OKBtn.SetFocus;</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>Verified := False;</p>
<p>MessageDlg('PassWord is InValid.',mtWarning,[mbOK],0);</p>
<p>Edit1.text := '';</p>
<p>PassWord := '';</p>
<p>Label1.Caption := 'Please Input PassWord:';</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>Verified := True;</p>
<p>StrPCopy(PassWord,Edit1.text);</p>
<p>Edit1.text := '';</p>
<p>Label1.caption := 'Please Verify PassWord:';</p>
<p>end;</p>
<p>Key := #0;</p>
<p>end;</p>
<p>end;</p>
<font face="宋体" lang="ZH-CN"><p> 口令检查窗口的实现相对简单,只定义了一个输出函数</font>GetPassWord<font
face="宋体" lang="ZH-CN">,用于生成口令检查窗口并返回口令检查的结果。 </p>
</font><p>function GetPassword(Password: PChar): Boolean;</p>
<p>var</p>
<p>GetPasswordForm: TGetPasswordForm;</p>
<p>begin</p>
<p>Result := False;</p>
<p>GetPasswordForm := TGetPasswordForm.Create(Application);</p>
<p>try</p>
<p>with GetPasswordForm do</p>
<p>if ShowModal = mrOK then</p>
<p>if UpperCase(Edit1.Text) <> StrPas(StrUpper(Password)) then</p>
<p>MessageDlg('Invalid Password', mtWarning, [mbOK], 0)</p>
<p>else</p>
<p>Result := True;</p>
<p>finally</p>
<p>PasswordForm.Free;</p>
<p>end;</p>
<p>end;</p>
<font face="宋体" lang="ZH-CN"><p> </font>PassWord<font face="宋体" lang="ZH-CN">为输入的参数,不能为空,由调用以上函数的程序负责维护。</p>
<p> 窗口中用户输入口令时回显在屏幕上的字符由编辑框的</font>PassWordChar<font
face="宋体" lang="ZH-CN">属性确定。</p>
<p> 在</font>DLLs<font face="宋体" lang="ZH-CN">的工程文件中,把两个输出函数写到</font>exports<font
face="宋体" lang="ZH-CN">子句中。 </p>
</font><p>library PassForm; </p>
<p>uses</p>
<p>GetPass in 'GETPASS.PAS' {PasswordForm},</p>
<p>Setpass in 'SETPASS.PAS' {SetPassWordForm}; </p>
<p>exports</p>
<p>GetPassword,SetPassWord; </p>
<p>begin</p>
<p>end. </p>
<p>10.4.2.2 Delphi<font face="宋体" lang="ZH-CN">应用程序调用重用窗体 </p>
<p> 在</font>Delphi<font face="宋体" lang="ZH-CN">应用程序中调用重用窗体,首先必须包含</font>passform.dll<font
face="宋体" lang="ZH-CN">的两个输出函数: </p>
</font><p>function GetPassword(Password: PChar): Boolean;</p>
<p>far; external 'c:\dlls\PassForm';</p>
<p>function SetPassword(PassWord: PChar): Boolean;</p>
<p>far; external 'c:\dlls\PassForm';</p>
<font face="宋体" lang="ZH-CN"><p> 这位于程序单元的</font>implementation<font
face="宋体" lang="ZH-CN">部分。</font></p>
<font face="宋体" lang="ZH-CN"><p>口令设置部分的实现代码为: </p>
</font><p>procedure TForm1.SetButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>PassWord := StrAlloc(40);</p>
<p>if SetPassWord(PassWord) = False then</p>
<p>MessageDlg('PassWord is not set',mtInformation,[mbOK],0); </p>
<p>end;</p>
<font face="宋体" lang="ZH-CN"><p> 首先为口令字符串分配内存。当口令设置窗体按</font>Cancel<font
face="宋体" lang="ZH-CN">按钮取消时,显示相应的信息。</p>
<p> 口令检查部分的实现代码为: </p>
</font><p>procedure TForm1.TestButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>if PassWord = nil then</p>
<p>begin</p>
<p>MessageDlg('Set password first', mtInformation, [mbOK], 0);</p>
<p>SetButton.SetFocus;</p>
<p>Exit;</p>
<p>end;</p>
<p>if GetPassword(PassWord) then</p>
<p>Label1.Caption := 'You are Wellcome !'</p>
<p>else</p>
<p>Label1.Caption := 'Sorry,You are InValid User.';</p>
<p>end;</p>
<font face="宋体" lang="ZH-CN"><p> 根据口令检查的结果,在标签框中显示相应的信息。 </p>
</font><p>10.4.2.3 VB<font face="宋体" lang="ZH-CN">应用程序调用重用窗体 </p>
<p> </font>VB<font face="宋体" lang="ZH-CN">是微软公司极力推荐的一个可视化开发工具。它虽然并不支持动态链接库的创建,但可以调用标准的</font>Windows
API<font face="宋体" lang="ZH-CN">动态链接库和用其它语言编写的动态链接库。为了验证所生成</font>DLLs<font
face="宋体" lang="ZH-CN">的普适性,我们用</font>VB<font face="宋体"
lang="ZH-CN">开发了一个简单的程序来调用</font>passform.dll<font face="宋体"
lang="ZH-CN">中储存的窗体。</font></p>
<font face="宋体" lang="ZH-CN"><p>下面是</font>VB<font face="宋体" lang="ZH-CN">程序的完整代码,和</font>Delphi<font
face="宋体" lang="ZH-CN">程序的对应部分基本一致。 </p>
</font><p>Option Explicit</p>
<p>Declare Function GetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As
String) As Integer</p>
<p>Declare Function SetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As
String) As Integer </p>
<p>Dim PassWord As String * 40</p>
<p>Sub Check_Click ()</p>
<p>If PassWord = "" Then</p>
<p>MsgBox ("Enter sample password first")</p>
<p>SetPass.SetFocus</p>
<p>Else</p>
<p>If GetPassWord(PassWord) Then</p>
<p>StatusLbl.Caption = "You are Welcome!"</p>
<p>Else</p>
<p>StatusLbl.Caption = "Sorry,You are Invalid User."</p>
<p>End If</p>
<p>End If</p>
<p>End Sub</p>
<p>Sub SetPass_Click ()</p>
<p>If SetPassWord(PassWord) = 0 Then</p>
<p>MsgBox ("PassWord is not Set.")</p>
<p>End If</p>
<p>End Sub</p>
<font face="宋体" lang="ZH-CN"><p> 有关</font>VB<font face="宋体" lang="ZH-CN">编程的一些具体问题,读者可参看有关的</font>VB<font
face="宋体" lang="ZH-CN">参考书。 </p>
</font><p>10.4.3 <font face="宋体" lang="ZH-CN">小结 </p>
<p> 本章我们讨论的是动态链接库编程。许多可视化开发工具(如</font>Visual
Basic<font face="宋体" lang="ZH-CN">)不支持</font> DLLs<font face="宋体"
lang="ZH-CN">的创建,而</font>Delphi<font face="宋体" lang="ZH-CN">在这里又有上乘的表现。特别是窗体重用机制是</font>Delphi<font
face="宋体" lang="ZH-CN">对</font>Windows<font face="宋体" lang="ZH-CN">下</font>DLLs<font
face="宋体" lang="ZH-CN">编程的一个重大改进。在一般的</font>DLLs<font
face="宋体" lang="ZH-CN">编程中也体现了</font>Delphi<font face="宋体"
lang="ZH-CN">快捷、方便的特点。动态链接库是</font> Windows<font
face="宋体" lang="ZH-CN">下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作。利用动态链接库,用户可以逐步去构筑自己的程序模块库,为今后的工作积累素材。</font></p>
<font face="宋体" lang="ZH-CN"><p> </font></p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="026.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="024.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -