2005年9月1日

Windows注册信息更改小软件

一直想编一个更改系统注册用户的单位信息的小软件,也想借此机会接触一下Windows编程。怎样编出一个Windows界面程序呢?




Windows 平台下的应用程序所使用的SDK(软件开发工具包)主要指Win32 API(Application Programing Interface),一个Windows32位环境下的应用程序编程接口,其中包括了众多的函数,提供了相当丰富的功能。Windows编程最经典的方法就是使用C语言和API编写,它是最为基础和经典的Windows编程方法,具有最佳的性能、最强大的功能和最活跃的灵活性。而且执行文件相对教小,且运行不需要外部库。这种纯粹的SDK编程不是Windows编程的唯一方法,许多其他开发环境提供了相对简单的Windows程序开发方法,比如VC++、VB等等。其中VC++和MFC(Microsoft基础类库)结合,MFC在一个C++类集合中封装了许多Windows编程中的繁重内容。使用其他编程软件VB、Delphi等等都可以调用Windows API来进行Windows编程。[separator]

说回我一直想编的小软,主要是对Windows注册表的操作,可以直接SDK,也可以利用VC++和MFC,由于以前接触过VB,就用VB调用Windows API的方法编了一个小软。

Windows API 中可用于注册表的函数一共有二十多个,根据其功能不同可以分为如下几类:

1.键管理类
RegCloseKey() RegCreateKey() RegCreateKeyEx() RegDeleteKey() RegDeleteKeyEx() RegOpenKey() RegOpenKeyEx()

2.值管理类
RegDeleteValue() RegQueryValue() RegQueryValueEx() RegSetValue() RegSetValueEx()

3.查询计数类
RegQueryInfoKey() RegEnumKey() RegEnumKeyEx() RegEnumValue()

4.备份/恢复类
RegLoadKey() RegReplaceKey() RegRestoreKey() RegSaveKey()

5.实用类
RegConnectRegistry() RegNotifyChangeKeyValue() RegUnloadKey()

6.安全类(仅适用于NT)
RegGetKeySecurity() RegSetKeySecurity()

原代码:

Option Explicit
'注册表API函数声明
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private 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 Any, ByVal cbData As Long) As Long
Const REG_SZ = 1
Const HKEY_LOCAL_MACHINE = &H80000002
Dim ret As Long
Dim KeyRoot1 As String, hKey1 As Long, GetID As String, GetOrg As String, NewID As String, NewOrg As String

Private Sub Command1_Click()
'确认时从文本框读新设用户名和单位保存到注册表
NewID = Text1.Text
NewOrg = Text2.Text
ret = RegSetValueEx(hKey1, "RegisteredOwner", 0, REG_SZ, NewID, Len(NewID))
If ret <> 0 Then
??? GoTo E2
End If
ret = RegSetValueEx(hKey1, "RegisteredOrganization", 0, REG_SZ, NewOrg, Len(NewOrg))
If ret <> 0 Then
??? GoTo E2
End If
MsgBox " 更改成功! "
E2:
??? '写注册表出错处理
End Sub

Private Sub Command2_Click()
Text1.Text = ""
Text2.Text = ""
End Sub

Private Sub Form_Load()
'装载窗口时从注册表读入用户名和单位到文本框
KeyRoot1 = "SOFTWAREMicrosoftWindows NTCurrentVersion"
ret = RegCreateKey(HKEY_LOCAL_MACHINE, KeyRoot1, hKey1)
If ret <> 0 Then
??? '打开注册表出错响应
End If
'注意RegQueryValueEx的返回值函数必须事先分配足够空间
GetID = String$(1024, 0)
GetOrg = String$(1024, 0)

'两倍的字符串长允许,否则中文输入显示一半
ret = RegQueryValueEx(hKey1, "RegisteredOwner", 0, REG_SZ, ByVal GetID, Len(GetID)*2)
If ret <> 0 Then
??? GoTo E1
End If
ret = RegQueryValueEx(hKey1, "RegisteredOrganization", 0, REG_SZ, ByVal GetOrg, Len(GetOrg)*2)
If ret <> 0 Then
??? GoTo E1
End If
Text1.Text = GetID
Text2.Text = GetOrg
E1:
??? '读注册表出错处理
End Sub

Private Sub Form_Unload(Cancel As Integer)
RegCloseKey hKey1
End Sub

Private Sub Label3_Click()
'做了一个小广告^L^,链接了我的BLOG
Shell "explorer http://will.512j.com/blog", vbMaximizedFocus
End Sub

7 条评论:

匿名 说...

程序又更新了一下,修补了中文输入的BUG,换了一个好看的图标。
发到嬴政去了,争取这个月拿到3分,呵呵

匿名 说...

看来是用心了,加油啊!

匿名 说...

不错 这个软件好

匿名 说...

慕名前来下载:)
软件简易实用。
继续努力!

匿名 说...

强的!

匿名 说...

还以为是vc作的,原来是vb啊,不过还是不错,继续努力

匿名 说...

Amongst necessary accessories at fire should be the a powerful a typical
forged iron Saucepan. Note while using these techniques belonging to the upshots of 'super-heating'.
If you are the baking, you could potentially permit the grass
heat up mainly because oven is progressing.

Check out my web page; dualit toaster reviews - -