首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

rainstormmaster大哥,小弟我是koei79,感谢帖,还有一问

2012-01-11 
rainstormmaster大哥,我是koei79,感谢帖,还有一问源程序已经收到,真的很感谢你抽空帮我做做,我运行了程序,

rainstormmaster大哥,我是koei79,感谢帖,还有一问
源程序已经收到,真的很感谢你抽空帮我做做,我运行了程序,确实你说的那样:不管用户是否注册都弹出注册窗体来,领导看了,肯定说我不行,就是应付领导,只要看上去不出岔子就行,现在请教你如何先做一个判断,如果是已经注册的用户,就不弹出注册窗体,未注册用户就弹出注册窗体,如何写出代码?

rainstormmaster大哥,你真是一个好人,话再说多也没意思,无言的感激!!!!!

下面用以上思路来设计我们自己的注册码:
首先,选择原码。当然选择注册的用户的用户名(最好是英文)来做注册码的原码
,是一个很好的办法,推荐用英文的理由是:英文字符串比中文字符串在运算中容
易控制,且不易出错;其次,选择密匙,按照密匙对于不同用户是不同且唯一的原
则,我强烈建议选择硬盘的序列号作为密匙。因为从理论上讲一个硬盘的序列号是
唯一的,而且不同分区的序列号也不相同。所以,我用硬盘上的C驱动器分区的序
列号来做密匙。因为C区好像每台电脑上都有(什么?你没有?我倒!!!);再
次,就是选择暗码了。当然了,暗码应该是由你利用以上思路做成的注册器来生成
,并作为注册码寄给用户的啦^-^,有关注册器的设计待会儿再说。
理解了以上的注册码生成的思想后,下面就利用Micosoft   的Visual   Basic6.0来完
成这项设计工作。需要利用几个Windows的API函数:GetVolumeInformation用以获
得硬盘的序列号、GetPrivateProfileString、WritePrivateProfileString用来读
写INI文件。对于以上三个API函数的使用不作介绍了,现将其声明如下:
Private   Declare   Function   GetVolumeInformation   Lib   ″kernel32″   Alias   ″
GetVolumeInformationA″   (ByVal   lpRootPathName   As   String,   ByVal  
lpVolumeNameBuffer   As   String,   ByVal   nVolumeNameSize   As   Long,  
lpVolumeSerialNumber   As   Long,   lpMaximumComponentLength   As   Long,  
lpFileSystemFlags   As   Long,   ByVal   lpFileSystemNameBuffer   As   String,   ByVal
  nFileSystemNameSize   As   Long)   As   Long   Private   Declare   Function  
GetPrivateProfileString   Lib   ″kernel32″   Alias   ″
GetPrivateProfileStringA″   (ByVal   lpApplicationName   As   String,   ByVal  
lpKeyName   As   Any,   ByVal   lpDefault   As   String,   ByVal   lpReturnedString   As  
String,   ByVal   nSize   As   Long,   ByVal   lpFileName   As   String)   As   Long
Private   Declare   Function   WritePrivateProfileString   Lib   ″kernel32″  
Alias   ″WritePrivateProfileStringA″   (ByVal   lpApplicationName   As   String,
  ByVal   lpKeyName   As   Any,   ByVal   lpString   As   Any,   ByVal   lpFileName   As  
String)   As   Long
以上这些声明放在窗体的“通用”中即可。程序窗体的结构图大致见图1:
程序的代码如下:
通用图1的代码:
'定义ini文件的文件变量
Dim   n   As   Integer
Dim   registry   As   String   *   255
Dim   inifilename   As   String
窗体中的代码:
'取得硬盘的序列号的函数
Function   GetSerialNumber(strDrive   As   String)   As   Long
Dim   SerialNum   As   Long   '定义序列号
Dim   Res   As   Long
Dim   Temp1   As   String
Dim   Temp2   As   String
Temp1   =   String$(255,   Chr$(0))
Temp2   =   String$(255,   Chr$(0))
'调用windows的API函数来获得硬盘序列号
Res   =   GetVolumeInformation(strDrive,   Temp1,  
Len(Temp1),   SerialNum,   0,   0,   Temp2,   Len(Temp2))
GetSerialNumber   =   SerialNum
End   Function
Private   Sub   Command1_Click()
Text3.Text   =   GetSerialNumber(″c:\″)   '取C分区的硬盘序列号
Dim   test   As   New   password   '定义新的加密类
Dim   r_string   As   String
Dim   temp   As   String
Dim   registry_string   As   String
registry_string   =   Text3.Text
'操作读写ini文件的API函数
Call   WritePrivateProfileString(″mouselock″,   ″registry″,  
registry_string,   inifileName)


r_string   =   Text2.Text
temp   =   test.crypt(″D″,   registry_string,   r_string)
If   Text1.Text   =   ″″   Then
MsgBox   ″必须输入用户名!″,   ,   ″注册″
End
End   If
If   temp   <>   (Text1.Text   +   ″i″)   Then   '设置区分码
MsgBox   ″你应该找作者注册,共享软件凝聚着作者的血和汗.″,   ,   ″注册″
Else
MsgBox   ″谢谢使用本软件!″,   ,   ″注册″
Dim   registry_string1   As   String
registry_string1   =   ″tttt″   '加入注册的标记并保存于ini文件中,可以自己设

'调用Windows的API函数来读写ini文件
Call   WritePrivateProfileString(″mouselock″,   ″reg″,   registry_string1,
  inifileName)
Form1.Show   '调用自己的应用程序
Unload   Me   '关闭注册程序
End   If
Text3.Visible   =   True
Label4.Visible   =   True
Label5.Visible   =   True
Label6.Visible   =   True
End   Sub
Private   Sub   Command2_Click()
Form1.Show   '运行你的共享软件主程序
Unload   Me   '关闭注册程序
End   Sub
Private   Sub   Form_Load()
Form2.Caption   =   ″Microsoft   Visual   Basic6.0″   '此处可以改为你的共享软件

Text3.Visible   =   False
Label4.Visible   =   False
Label5.Visible   =   False
Label6.Visible   =   False
End   Sub
还需要加一个password的类模块,在其中利用的是伪随机数的加密算法来完成加密
和解密转换,因涉及到算法,其原理不再详述,仅列其代码如下:
Option   Explicit
Function   crypt(Action   As   String,   Key   As   String,   Src   As   String)   As  
String
Dim   Count   As   Integer,   KeyPos   As   Integer,   KeyLen   As   Integer,   SrcAsc   As  
Integer,   dest   As   String,   offset   As   Integer,   TmpSrcAsc,   SrcPos
KeyLen   =   Len(Key)
If   Action   =   ″E″   Then
Randomize
offset   =   (Rnd   *   10000   Mod   255)   +   1
dest   =   Hex$(offset)
If   Len(dest)   =   1   Then
dest   =   ″0″   +   dest
End   If
For   SrcPos   =   1   To   Len(Src)
SrcAsc   =   (Asc(Mid$(Src,   SrcPos,   1))   +   offset)   Mod   255
If   KeyPos   <   KeyLen   Then   KeyPos   =   KeyPos   +   1   Else   KeyPos   =   1
SrcAsc   =   SrcAsc   Xor   Asc(Mid$(Key,   KeyPos,   1))
dest   =   dest   +   Format$(Hex$(SrcAsc),   ″@@″)
offset   =   SrcAsc
Next
ElseIf   Action   =   ″D″   Then
offset   =   Val(″&H″   +   Left$(Src,   2))
For   SrcPos   =   3   To   Len(Src)   Step   2
SrcAsc   =   Val(″&H″   +   Trim(Mid$(Src,   SrcPos,   2)))
If   KeyPos   <   KeyLen   Then   KeyPos   =   KeyPos   +   1   Else   KeyPos   =   1
TmpSrcAsc   =   SrcAsc   Xor   Asc(Mid$(Key,   KeyPos,   1))
If   TmpSrcAsc   <=   offset   Then
TmpSrcAsc   =   255   +   TmpSrcAsc   -   offset
Else
TmpSrcAsc   =   TmpSrcAsc   -   offset
End   If
dest   =   dest   +   Chr(TmpSrcAsc)
offset   =   SrcAsc


Next
End   If
crypt   =   dest
End   Function
好啦,按F5运行你的注册程序,在点击了“注册”按钮后就出现如图2所示的窗体

还需添加一个ini文件到程序的相对目录下,且字段如下:
[mouselock]
registry=757931525
reg=
好了,一个软件的注册的部分基本完工了,你可以自己设置“运行”按钮中的的代
码来控制未注册用户的使用权限,如:使用次数、使用天数、以及用户注册的要求
(当然我们都喜欢免费共享软件)等等。当然也可以不加以限制,只是在每次运行
软件时会弹出一个注册窗体而已,就如著名的软件ACDSee一样。
还有一点须加以注意:在窗体代码中,有一行代码如下:
If   temp   <>   (Text1.Text   +   ″i″)   Then   '设置区分码
它是用来设置区分码的,因为这个程序的加密算法并不是像微软的加密算法那样无
人可知,它不过是一种普通的加密算法,但加上了区分码后它的加密性能便提高了
许多,如同锁上加锁一样。分区码“″i″”可以由自己随意去添加,这样即使别
人知道了你的算法也无法破译你的注册码,因为整个加密过程已经由:(明码+密
匙)→暗码,变为:(明码+区分码+密匙)→暗码;而解密过程也相应的由:(
暗码+密匙)→明码,变为:(暗码+密匙)→(明码+区分码)。
当然,你也可以对区分码来一个加密,不过这样一层层的加密下去是永无止境的,
还是适可为止的好。
注册程序搞定后当然还需要一个注册器啦,用来向你的用户提供注册码嘛!其设计
的窗体结构如图3:
在窗体和“生成”按钮中添加如下代码:
Private   Sub   Command1_Click()
Dim   ppp   As   New   password   '定义一个型的类
'定义明码、暗码、密匙、及区分码
Dim   D_string   As   String
Dim   E_string   As   String
Dim   Qf_string   As   String
Dim   MC_string   As   String
D_string   =   Text1.Text
Qf_string   =   Text2.Text
MC_string   =   Text3.Text
'加密
If   Text2.Text   =   ″″   Then
E_string   =   ppp.crypt(″E″,   MC-string,   D_string)
Else
D_string   =   D_string   +   Qf_string
E_string   =   ppp.crypt(″E″,   MC_string,   D_string)
End   If
Text4.Text   =   E_string
End   Sub
Private   Sub   Form_Load()
Form1.Caption   =   ″注册器″
Text1.Text   =   ″″
Text2.Text   =   ″″
Text3.Text   =   ″″
Text4.Text   =   ″″
End   Sub
当然,还需要加一个“password”的类模块了,就如前述一样,在此不再累述。
当你的用户给你寄过来他的用户名和他的硬盘序列号后,将用户名和序列号依次输
入注册器中,再填入你自己的区分码后,按“生成”钮便可得到相对应的注册码了
,回寄给你的用户,享受成功的快感吧。
到此为止,我们就完成了注册码的制作的全过程,希望各位高手指正。


[解决办法]
那就随便用ini或者注册表保存信息吧,代码已发送

顺便唠叨一句,外行指挥内行真是一件很郁闷的事

热点排行