分享
 
 
 

为您的应用程序加上注册的限制

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

为您的应用程序加上注册的限制是不是很好,至少现在的共享软件都是这样做的。 大家都用过Winzip这个软件吧!当未注册时每次启动都会弹出个该死的对话框,只有正确的注册后此对话框才会消失。这就是我们本次所要实现的目标。对于这些信息我们将其存储在注册表中VB6.0提供了一个函数及一条语句用于读写注册表它们是GetSetting 和 SaveSetting 遗憾的是我们不能用它将键值 写在注册表的任意位置。难道就没有别的函数了吗?NO!有!那就是Micro$oft的Win32 API 它所提供的 函数可以让我们随意的读写注册表的任何位置包括新建键值、删除键值、新建项目等等……。废话就不多 说了我们还是先来看看如何实现吧!

以下控件使用默认名称请不要改变。

1、新建两个窗体。

2、在第一个窗体(Form1)上放置两个文本框及两个按钮。

3、在第二个窗体(Form2)上放置5个标签

4、新建一个标准模块

您现在可以将代码粘贴过去运行了。

模块的代码

Option Explicit

' 这个模块用于读和写注册表关键字。

' 不同于VB 的内部注册表访问方法,它可以

' 通过字符串的值来读和写任何注册表关键字。

'---------------------------------------------------------------

'-注册表 API 声明...

'RegCloseKey 用于关闭系统注册表中的一个项(或键)

'RegCreateKeyEx用于创建注册表项

'RegOpenKeyEx用于打开注册表项

'RegQueryValueEx 用于获取一个项的设置值

'RegSetValueEx 用于设置指定项的值

'---------------------------------------------------------------

Public Declare Function RegCloseKey Lib 'advapi32' (ByVal hkey As Long) As Long

Public Declare Function RegCreateKeyEx Lib 'advapi32' Alias 'RegCreateKeyExA' (ByVal hkey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, ByRef lpdwDisposition As Long) As Long

Public Declare Function RegOpenKeyEx Lib 'advapi32' Alias 'RegOpenKeyExA' (ByVal hkey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long

Public Declare Function RegQueryValueEx Lib 'advapi32' Alias 'RegQueryValueExA' (ByVal hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long

Public Declare Function RegSetValueEx Lib 'advapi32' Alias 'RegSetValueExA' (ByVal hkey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long

'---------------------------------------------------------------

'- 注册表 Api 常数...

'---------------------------------------------------------------

' Reg Data Types...

Public Const REG_SZ = 1 ' Unicode空终结字符串

Public Const REG_EXPAND_SZ = 2' Unicode空终结字符串

Public Const REG_DWORD = 4' 32-bit 数字

Public Const REG_BINARY = 3

' 注册表创建类型值...

Public Const REG_OPTION_NON_VOLATILE = 0 ' 当系统重新启动时,关键字被保留

' 注册表关键字安全选项...

Public Const READ_CONTROL = &H20000

Public Const KEY_QUERY_VALUE = &H1

Public Const KEY_SET_VALUE = &H2

Public Const KEY_CREATE_SUB_KEY = &H4

Public Const KEY_ENUMERATE_SUB_KEYS = &H8

Public Const KEY_NOTIFY = &H10

Public Const KEY_CREATE_LINK = &H20

Public Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL

Public Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL

Public Const KEY_EXECUTE = KEY_READ

Public Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _

KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _

KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL

' 注册表关键字根类型...

Public Const HKEY_CLASSES_ROOT = &H80000000

Public Const HKEY_CURRENT_USER = &H80000001

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const HKEY_USERS = &H80000003

Public Const HKEY_PERFORMANCE_DATA = &H80000004

' 返回值...

Public Const ERROR_NONE = 0

Public Const ERROR_BADKEY = 2

Public Const ERROR_ACCESS_DENIED = 8

Public Const ERROR_SUCCESS = 0

'---------------------------------------------------------------

'- 注册表安全属性类型...

'---------------------------------------------------------------

Private Type SECURITY_ATTRIBUTES

nLength As Long

lpSecurityDescriptor As Long

bInheritHandle As Boolean

End Type

'-------------------------------------------------------------------------------------------------

'本函数在注册表中创建新的项及键值

'sample usage - Debug.Print UpodateKey(HKEY_CLASSES_ROOT, 'keyname', 'newvalue')

'-------------------------------------------------------------------------------------------------

Public Function UpdateKey(KeyRoot As Long, KeyName As String, SubKeyName As String, SubReg As Long, SubKeyValue As String, IngNumber As Long) As Long

Dim rc As Long' 返回代码

Dim hkey As Long' 处理一个注册表关键字

Dim hDepth As Long'

Dim lpAttr As SECURITY_ATTRIBUTES ' 注册表安全类型

lpAttr.nLength = 50 ' 设置安全属性为缺省值...

lpAttr.lpSecurityDescriptor = 0 ' ...

lpAttr.bInheritHandle = True' ...

'------------------------------------------------------------

'- 创建/打开注册表关键字...

'创建/打开//KeyRoot//KeyName

' 错误处理...

'------------------------------------------------------------

rc = RegCreateKeyEx(KeyRoot, KeyName, 0, '', 0, KEY_WRITE, lpAttr, hkey, hDepth)

If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError

'------------------------------------------------------------

'- 创建/修改关键字值...

' 要让RegSetValueEx() 工作需要输入一个空格...

' 创建/修改关键字值

'- 关闭注册表关键字...

'------------------------------------------------------------

Select Case SubReg

Case REG_SZ

rc = RegSetValueEx(hkey, SubKeyName, 0, SubReg, SubKeyValue, IngNumber)

If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError

End Select

rc = RegCloseKey(hkey)' 退出

Exit Function ' 错误处理

CreateKeyError:

UpdateKey = False ' 设置错误返回代码

rc = RegCloseKey(hkey)' 试图关闭关键字

End Function

'-------------------------------------------------------------------------------------------------

'本函数在注册表中读取键值

'sample usage - Debug.Print GetKeyValue(HKEY_CLASSES_ROOT, 'COMCTL.ListviewCtrl.1\CLSID', '')

'-------------------------------------------------------------------------------------------------

Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String) As String

Dim I As Long ' 循环计数器

Dim rc As Long' 返回代码

Dim hkey As Long' 处理打开的注册表关键字

Dim hDepth As Long'

Dim sKeyVal As String

Dim lKeyValType As Long ' 注册表关键字数据类型

Dim tmpVal As String' 注册表关键字的临时存储器

Dim KeyValSize As Long' 注册表关键字变量尺寸

' 在 KeyRoot {HKEY_LOCAL_MACHINE...} 下打开注册表关键字

'------------------------------------------------------------

rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hkey) ' 打开注册表关键字

If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError' 处理错误...

tmpVal = String$(1024, 0) ' 分配变量空间

KeyValSize = 1024 ' 标记变量尺寸

'------------------------------------------------------------

' 检索注册表关键字的值...

'------------------------------------------------------------

rc = RegQueryValueEx(hkey, SubKeyRef, 0, _

lKeyValType, tmpVal, KeyValSize)' 获得/创建关键字的值

If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError ' 错误处理

tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)

'------------------------------------------------------------

' 决定关键字值的转换类型...

'------------------------------------------------------------

Select Case lKeyValType ' 搜索数据类型...

Case REG_SZ, REG_EXPAND_SZ' 字符串注册表关键字数据类型

sKeyVal = tmpVal' 复制字符串的值

Case REG_DWORD' 四字节注册表关键字数据类型

For I = Len(tmpVal) To 1 Step -1' 转换每一位

sKeyVal = sKeyVal + Hex(Asc(Mid(tmpVal, I, 1))) ' 一个字符一个字符地生成值。

Next

sKeyVal = Format$('&h' + sKeyVal) ' 转换四字节为字符串

End Select

GetKeyValue = sKeyVal ' 返回值

rc = RegCloseKey(hkey)' 关闭注册表关键字

Exit Function ' 退出

GetKeyError:' 错误发生过后进行清除...

GetKeyValue = vbNullString' 设置返回值为空字符串

rc = RegCloseKey(hkey)' 关闭注册表关键字

End Function

窗体1(Form1)的代码

Private Sub Command1_Click()

Dim password As String

If Text2.Text = '19811127' Then

UpdateKey HKEY_LOCAL_MACHINE, 'software\编程浪子', '姓名', REG_SZ, Text1.Text, LenB(Text1.Text)

UpdateKey HKEY_LOCAL_MACHINE, 'software\编程浪子', '注册密码', REG_SZ, Text2.Text, 8

MsgBox '感谢您对我们编程浪子的支持,请访问我们的网站。' & vbCrLf & 'Http://vbchina.chinahot.com', vbOKOnly + vbInformation, '谢谢,编程浪子欢迎您'

Form2.Show

Unload Me

Else

MsgBox '抱歉!注册密码错误,请访问Http://vbchina.chinahot.com获得注册码!。', vbOKOnly + vbExclamation, '注册出错'

Text2.SetFocus

Text2.SelStart = 0

Text2.SelLength = Len(Text2.Text)

End If

End Sub

Private Sub Command2_Click()

Form2.Show

Unload Me

End Sub

Private Sub Form_Load()

Command1.Caption = '确定'

Command2.Caption = '试用'

Dim password As String

password = GetKeyValue(HKEY_LOCAL_MACHINE, 'software\编程浪子', '注册密码')

If password = '198119811127' Then

Form2.Show

Unload Me

End If

End Sub

窗体2(Form2)的代码

Private Sub Form_Load()

Dim password As String, Name As String

password = GetKeyValue(HKEY_LOCAL_MACHINE, 'software\编程浪子', '注册密码')

Name = GetKeyValue(HKEY_LOCAL_MACHINE, 'software\编程浪子', '姓名')

If password = '198119811127' Then

Label1.Caption = '这里是您的注册信息:'

Label2.Caption = '本软件注册给'

Label3.Caption = '姓名:' & Name

Label4.Caption = '公司:' & Corp

Label5.Caption = '注册密码:' & password

Else

Label1.Caption = '未注册'

Label2.Caption = '本软件注册给'

Label3.Caption = '姓名:江建'

Label4.Caption = '公司:编程浪子'

Label5.Caption = '注册密码:Http://vbchina.chinahot.com'

End If

End Sub

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有