写入Registry“RegSetValueEx”只能进行调试

时间:2012-01-08 04:17:25

标签: debugging api vb6 registry

我正在尝试修改特定的注册表项,但只有在我构建它之后才调试应用程序时它才会起作用。

我发现这很奇怪所以我转向你们寻求帮助。

Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal       hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Const BM_CLICK = &HF5
Const REG_DWORD = 4
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const REGKEY = "Software\Microsoft\Windows\CurrentVersion\Policies\system"
Const KEY_WRITE = &H20006
Dim Path As Long
Dim Value As Long

Sub TASK()
On Error GoTo hell:
Value = 1
If RegOpenKeyEx(HKEY_CURRENT_USER, REGKEY, 0, KEY_WRITE, Path) Then Exit Sub

RegSetValueEx Path, NameOfKey, 0, REG_DWORD, Value, Len(Value)
Exit Sub
hell:
MsgBox Err & Error(Err)
End Sub

Sub UAC()
On Error GoTo hell:
Value = 0
If RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY, 0, KEY_WRITE, Path) Then Exit Sub

RegSetValueEx Path, "ConsentPromptBehaviorAdmin", 0&, REG_DWORD, Value, Len(Value)
Exit Sub
hell:
MsgBox Err & Error(Err)
End Sub

我确信这只是我想念的小事。

1 个答案:

答案 0 :(得分:2)

这可能无法解决您的所有问题,但需要考虑重要事项:

If RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY, 0, KEY_WRITE, Path) Then Exit Sub 

除非您是管理员,否则无法写入HKEY_LOCAL_MACHINE。在XP中,这会抛出错误而失败,我相信。我相信Vista和Win7的处理方式不同。我认为在Vista和Win7中,写入在用户的配置文件中进行虚拟化,不会引发任何错误。该条目不存储在HKEY_LOCAL_MACHINE中,而是存储在所谓的虚拟存储中。这些版本的Windows还可以通过此服务虚拟化对受保护系统文件的文件访问。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884(v=vs.85).aspx

本文中也是#6 ... http://blogs.msdn.com/b/chinmay_palei/archive/2011/01/16/windows-7-application-compatibility-issues-fix-centre.aspx

您是否可以将VB IDE设置为以管理员身份运行?这会导致您的调试会话以管理员身份运行,但是当您自己运行EXE时,它会以用户身份运行吗?无论哪种方式,此行肯定会导致您的用户出错。