⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 070.htm

📁 Delphi书籍--Delphi网上教程
💻 HTM
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI专题文档-程序应用-->用Delphi3编写"共享软件"</TITLE>
<META NAME="keywords" CONTENT=" DELPHI专题文档-程序应用 用Delphi3编写"共享软件"">
<META NAME="description" CONTENT=" - DELPHI专题文档-程序应用 - 用Delphi3编写"共享软件"">

<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<a href="index6.html">返回</a>

<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>

<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">用Delphi3编写"共享软件"</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<br>
----本文是笔者用Delphi3编写的几个&quot;共享&quot;的小程序,给程序加入注册功能,让它变成一个&quot;共享软件&quot;,然后把它放入你的主页,可免费下载,从而帮助您获得更大的用户群。<br>
<br>
----这里需说明的是,本文仅从限制软件功能的侧面,探讨&quot;共享软件&quot;的编写方法。<br>
<br>
生成软件登录码<br>
----生成一个稳定的且相对唯一的软件登录码,是&quot;共享软件&quot;赖以生存的基础,所以必须选择一个好的算法来生成软件登录码。<br>
----稳定的涵义是指生成的软件登录码仅与机器的某些固定配置有关,不会因用户的一些日常操作而改变。为叙述方便,本文仅采用了C盘总容量、Windows安装时所输入的用户名、用户使用本软件时所提供的单位全称和用户姓名等信息,根据用户的需要,还可加入硬盘物理参数、主板的标识等等。<br>
<br>
----以下生成软件登录码的代码,应放置于软件登录窗口的&quot;生成登录码&quot;按钮的OnClick事件代码中。</p>
<p class="p2">   procedure TRegBox.BitBtn1Click(Sender: TObject);<br> 
   var users:pchar;<br> 
    i:integer;<br> 
    n1:longint;<br> 
   //n2:longint,s0,s1,s2,s3:string 定义为全程变量<br> 
   begin<br>
    i:=255;<br> 
    getmem(users,255); //分配内存空间<br> 
    getusername(users,i);//获得Windows用户名<br> 
    s1:=trim(Edit1.Text);//用户输入的单位全称<br> 
    s2:=trim(Edit2.Text);//用户输入的用户姓名<br> 
    s0:='jdk' +users +'ue28'; //避免用户名太短<br> 
    freemem(users); //释放内存空间<br> 
    s1:=s2 +'xwplskf' +s1 +'ruieo';<br> 
//合成单位全称和用户姓名<br> 
    n1 := DiskSize(3) div 1024 ; //C盘总容量<br> 
    n2 :=1 ;<br> 
    for i:=1 to length(s1) do //登录码与s1相关联<br> 
    n2:=abs((ord(s1[i]) *n2 + $f77)) mod 1000000;<br> 
    for i:=2 to length(s0) do <br> 
//登录码与s0和C盘容量相关联<br> 
    n2:=abs((ord(s0[i]) *n2 +n1)) mod 1000000; <br> 
//下面的转换生成8位数字的登录码n2<br> 
    n2:=10504007 +abs((n2 +n1) *(length(s1) +length(s0)));<br> 
    Edit4.text:=copy(inttostr(n2),1,8);<br> 
    n2:=strtoint(copy(inttostr(n2),1,8));<br> 
   end;</p>
<p class="p2"><br>
生成注册密码<br>
----有了登录码,还需要一个单独的程序,采取一定的算法来加密登录码,生成一个注册密码,加密算法的强度越大越好。这个单独的程序即为电子注册密码生成程序,当然它不能提供给任何用户,但需要在提供给用户使用的&quot;共享软件&quot;中&quot;注册&quot;按钮的OnClick事件中,写入等价的代码,以判断用户自己输入的注册密码是否正确。</p>
<p class="p2">   procedure Tencodeform.Button1Click(Sender:TObject);<br> 
   var n2:longint;<br> 
    s1,s2,s4:string;<br> 
    i:integer;<br> 
   begin<br>
    n2:=strtoint(Edit1.text); <br> 
// 用 户 反 馈 的 软 件 登 录 码<br> 
    n2:=120873762 +abs((n2 div 133) *171 xor 39639421);<br> 
    s1:=copy(inttostr(n2),1,8);<br> 
    s2:='73461852';<br> 
    s4:=''; //s4 : 由n2 变 换 生 成 的 注 册 密 码<br> 
    for i:=1 to 8 do<br> 
    s4:=s4 +s1ord(s2[i]) -ord('1') +1〗;<br> 
    // 在Edit2 编 辑 框 显 示 生 成 的 注 册 密 码, <br> 
将 它 告 诉 申 请 的 用 户<br> 
    Edit2.text:=s4; <br> 
   end; </p>
<p class="p2">注册<br>
----用户通过单击&quot;注册&quot;按钮,来实现软件的注册,这一段代码要完成以下功能:<br>
程序自动生成的注册密码;<br>
用生成的注册密码与用户输入的注册密码进行核对;<br>
如果一致,则关闭&quot;注册&quot;菜单项,并在缺省目录下创建一个注册文件,这个文件包括以下内容:<br>
  [USER]<br>
  单位全称、用户姓名、电话号码、[CODE〗<br>
  注册码=XXXXXXXX<br>
  &quot;注册&quot;按钮的OnClick事件代码如下:</p>
<p class="p2">   procedure TRegBox.BitBtn2Click(Sender: TObject);<br> 
   var myfile:textfile;<br> 
    i:integer;<br> 
   begin<br>
    s5:=trim(Edit5.text);//s5=用户输入注册密码<br> 
    //以下代码对n2进行变换生成注册密码<br> 
    n2:=120873762 +abs((n2 div 133) *171 xor 39639421);<br> 
    s1:=copy(inttostr(n2),1,8); //8 位 数 字<br> 
    s2:='73461852'; //移位变换<br> 
    s4:='';//s4=程序自动生成的注册密码<br> 
    for i:=1 to 8 do<br> 
    s4:=s4 +s1ord(s2[i]) -ord('1') +1〗;<br> 
    if strtoint(s4) *7&lt;&gt;strtoint(s5) *7 then begin<br> 
    MainBox.r2.Visible:=True; //打开&quot;注册&quot;菜单<br> 
    Edit4.Text:=''; //清空登录码<br> 
    Edit5.Text:=''; //清空注册密码<br> 
    MessageDlg('注册码不对,请核对后再注册!', mtWarning, [mbOk], 0)<br> 
    end<br> 
    else begin //注册成功后,创建一个注册文件<br> 
    MainBox.r2.Visible:=False;<br> 
    assignfile(myfile,'wps2word.log');<br> 
    rewrite(myfile);<br> 
    writeln(myfile,'[ER\IS]');<br> 
    writeln(myfile,'单位全称=',trim(Edit1.Text));<br> 
    writeln(myfile,'用户姓名=',trim(Edit2.Text));<br> 
    writeln(myfile,'电话号码=',trim(Edit3.Text));<br> 
    writeln(myfile,'CODE]');<br> 
    writeln(myfile,'注册码=',s4);<br> 
    closefile(myfile);<br> 
    MessageDlg<br> 
('注册码成功,谢谢您使用本软件!', mtWarning, [mbOk\], 0)<br> 
    end;<br> 
   end;</p>
<p class="p2">判断软件是否注册<br>
----判断软件是否注册的代码应放在应用程序主窗口的OnCreate事件中,在这一段代码中,主要完成以下功能:<br>
判断软件注册文件是否存在及是否符合规范(可能被用户误修改);<br>
从注册文件中读取注册密码及程序自动生成注册密码所需要的信息;<br>
如果两者一致,则置注册成功标志,关闭主菜单中的&quot;注册&quot;菜单项,否则,打开&quot;注册&quot;菜单项。</p>
<p class="p2">   procedure TMainBox.FormCreate(Sender: TObject);<br> 
   var s0,s1,s2,s3:string;<br> 
//s4,s5:string为全程变量<br> 
    n1,n2:longint;<br> 
    myfile:textfile;<br> 
    users:pchar;<br> 
    i:integer;<br> 
   begin<br>
    if not fileexists('wps2word.log') then<br> 
    begin //不存在注册文件,则没有注册<br> 
    r2.Visible:=True; //允许&quot;注册&quot;菜单项<br> 
    Randomize; //初始化随机数序列<br> 
    n1:=random(100000000);<br> 
//产生一个8位以内的整数<br> 
    s4:=inttostr(n1);<br> 
//假设输入的注册密码为s4<br> 
    s5:=inttostr(n1 +7) <br> 
//假设程序生成的注册密码为s5,令s4&lt;&gt;s5<br> 
    end<br> 
    else begin //存在注册文件的处理<br> 
    assignfile(myfile,'wps2word.log');<br> 
    reset(myfile);<br> 
//读取用户注册信息及注册密码<br> 
    if not eof(myfile) then readln(myfile,s0);<br> 
    if not eof(myfile) then readln(myfile,s1);<br> 
    if not eof(myfile) then readln(myfile,s2);<br> 
    if not eof(myfile) then readln(myfile,s3);<br> 
    if not eof(myfile) then readln(myfile,s4);<br> 
    if not eof(myfile) then readln(myfile,s5);<br> 
    closefile(myfile);<br> 
    if (length(s1)&lt; 10) or (length(s2)&lt; 10) <br> 
or (length(s3)&lt; 10) or (length(s5)&lt; 15) then<br> 
    begin <br> 
//文件格式有误,则删除注册文件,并退出<br> 
     deletefile('wps2word.log');<br>
     r2.Visible:=True; //允许&quot;注册&quot;菜单<br> 
     Exit; //退出<br> 
end;<br> 
i:=255;<br> 
getmem(users,255);<br> 
getusername(users,i); //获得Windows用户名<br> 
    s0:='jdk' +users +'ue28'; //避免用户名太短<br> 
    freemem(users);<br> 
s1:=trim(copy(s1,10,length(s1) -9)); //单位全称<br> 
    s2:=trim(copy(s2,10,length(s2) -9)); //用户姓名<br> 
    s5:=trim(copy(s5,8,length(s5) -7)); <br> 
//注册密码(待核对)<br> 
    s1:=s2 +' xwplskf' +s1 +'ruieo'; <br> 
//合成单位全称和用户姓名<br> 
    n1 := DiskSize(3) div 1024 ; //C盘容量<br> 
    n2 :=1 ;<br> 
    for i:=1 to length(s1) do<br> 
    n2:=abs((ord(s1[i]) *n2 + $f77)) mod 1000000;<br> 
    for i:=2 to length(s0) do<br> 
    n2:=abs((ord(s0[i]) *n2 +n1)) mod 1000000;<br> 
    n2:=10504007 +abs((n2 +n1) *(length(s1) +length(s0)));<br> 
    n2:=strtoint(copy(inttostr(n2),1,8)); //登录码<br> 
    //以下部分生成注册密码<br> 
    n2:=120873762 +abs((n2 div 133) *171 xor 39639421);<br> 
    s1:=copy(inttostr(n2),1,8);<br> 
    s2:='73461852'; //移位变换<br> 
    s4:=''; //S4为程序自动生成的注册密码<br> 
    for i:=1 to 8 do<br> 
    s4:=s4 +s1[ord(s2[i]) -ord('1') +1〗;<br> 
    //核对注册文件和自动生成的注册密码是否致<br> 
    if strtoint(s4) *7=strtoint(s5) *7 then<br> 
    r2.Visible:=False //一致<br> 
    else begin // 不一致<br> 
    deletefile('wps2word.log'); //删除注册文件<br> 
    r2.Visible:=True; //允许&quot;注册&quot;菜单项<br> 
      end;<br> 
    end;<br> 
   end;</p>
<p class="p2">开放和限制部分功能方法<br>
----采取核对程序自动生成和用户输入的注册密码是否一致,并检查&quot;注册&quot;菜单项是否允许的方式,在应用程序的功能代码中判断是否已经注册,以控制程序的流向。<br>
----if((r2.Visible=True)or(strtoint(s4)*7&lt;&gt;strtoint(s5)*7))and(其他条件)then<br>
<br>
  ……未注册时的处理<br>
  else<br>
  ……成功注册时的处理。<br>
----至此,本文仅讨论了限制软件使用功能的&quot;共享软件&quot;的编写方法,如果想限制软件使用时间,在软件注册标志中还应包括第一次安装的时间,并且注册标志不能简单地写入一个文件,它应隐藏在硬盘或注册表的某一特定位置,有兴趣的读者不妨一试。</p>
<hr color="#EE9B73" size="1" width="94%">

</TD>

</TR>
</table>
</BODY></HTML>

⌨️ 快捷键说明

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