我用这个函数为什么改不了系统注册表的值(os 为xp系统),请高手救命啊 急用SaveDword(HKEY_CURRENT_USER, "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1", "1001", 0)
下面是模块
Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nsize As Long) As Long' -----------------
' ADVAPI32
' -----------------
' function prototypes, constants, and type definitions
' for Windows 32-bit Registry APIPublic 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_SUCCESS = 0&' Registry API prototypesDeclare Function RegCloseKey Lib "advapi32.dll" (ByVal Hkey As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal Hkey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal Hkey As Long, ByVal lpSubKey As String) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal Hkey As Long, ByVal lpValueName As String) As Long
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal Hkey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
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
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
Public Const REG_SZ = 1                         ' Unicode nul terminated string
Public Const REG_DWORD = 4                      ' 32-bit numberPublic Sub savekey(Hkey As Long, strPath As String)
Dim keyhand&
r = RegCreateKey(Hkey, strPath, keyhand&)
r = RegCloseKey(keyhand&)
End SubPublic Function getstring(Hkey As Long, strPath As String, strValue As String)Dim keyhand As Long
Dim datatype As Long
Dim lResult As Long
Dim strBuf As String
Dim lDataBufSize As Long
Dim intZeroPos As Integer
r = RegOpenKey(Hkey, strPath, keyhand)
lResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&, lDataBufSize)
If lValueType = REG_SZ Then
    strBuf = String(lDataBufSize, " ")
    lResult = RegQueryValueEx(keyhand, strValue, 0&, 0&, ByVal strBuf, lDataBufSize)
    If lResult = ERROR_SUCCESS Then
        intZeroPos = InStr(strBuf, Chr$(0))
        If intZeroPos > 0 Then
            getstring = Left$(strBuf, intZeroPos - 1)
        Else
            getstring = strBuf
        End If
    End If
Else
    getstring = "Error"
End If
End Function
Public Sub savestring(Hkey As Long, strPath As String, strValue As String, strdata As String)
Dim keyhand As Long
Dim r As Long
r = RegCreateKey(Hkey, strPath, keyhand)
r = RegSetValueEx(keyhand, strValue, 0, REG_SZ, ByVal strdata, LenB(strdata))
r = RegCloseKey(keyhand)
End Sub
Function getdword(ByVal Hkey As Long, ByVal strPath As String, ByVal strValueName As String) As Long
Dim lResult As Long
Dim lValueType As Long
Dim lBuf As Long
Dim lDataBufSize As Long
Dim r As Long
Dim keyhand As Longr = RegOpenKey(Hkey, strPath, keyhand) ' Get length/data type
lDataBufSize = 4
    
lResult = RegQueryValueEx(keyhand, strValueName, 0&, lValueType, lBuf, lDataBufSize)If lResult = ERROR_SUCCESS Then
    If lValueType = REG_DWORD Then
        getdword = lBuf
    End If
'Else
'    Call errlog("GetDWORD-" & strPath, False)
End Ifr = RegCloseKey(keyhand)
    
End FunctionFunction SaveDword(ByVal Hkey As Long, ByVal strPath As String, ByVal strValueName As String, ByVal lData As Long)
    Dim lResult As Long
    Dim keyhand As Long
    Dim r As Long
    r = RegCreateKey(Hkey, strPath, keyhand)
    lResult = RegSetValueEx(keyhand, strValueName, 0&, REG_DWORD, lData, 4)
    'If lResult <> error_success Then Call errlog("SetDWORD", False)
    r = RegCloseKey(keyhand)
End FunctionPublic Function DeleteKey(ByVal Hkey As Long, ByVal strKey As String)
Dim r As Long
r = RegDeleteKey(Hkey, strKey)
End FunctionPublic Function DeleteValue(ByVal Hkey As Long, ByVal strPath As String, ByVal strValue As String)
Dim keyhand As Long
r = RegOpenKey(Hkey, strPath, keyhand)
r = RegDeleteValue(keyhand, strValue)
r = RegCloseKey(keyhand)
End Function

解决方案 »

  1.   

    [名称]           文件关联[数据来源]       visualbasic2000/csdn[内容简介]       空[源代码内容]如何在 VB6.0中 创建自己的文件类型
        在Windows中,当我们双击一个.txt文件的时候,“记事本”程序会自动打开,并且显示.txt文件的内容;当我们将一个.txt文件拖到“记事本”的图标上的时候,“记事本”程序也会自动打开,并且显示.txt文件的内容。在Windows中,这种技术称为“文件关联”,是一种非常实用,大大方便操作者的功能。当我们自己设计了一个程序,往往自己的程序需要使用自己定义的文件才能运行。例如,我曾经设计了一个“填字游戏”,这个游戏需要一种“字谜文件”来支持,如果用户要玩“填字游戏”,他们必须首先启动“填字游戏”的程序,然后在菜单上面选择“文件”,然后是“打开字谜”,接着在“打开字谜”的对话框中选择一个字谜文件,最后按下“开始游戏”才能进行游戏。我一直在想,能不能简化这些操作,用户只要双击“字谜文件”,系统就能自动完成前期的操作,用户只要按下“开始游戏”就能进行游戏了。可能在VC中这样的功能很容易实现的,但是VB行不行呢?答案是“完全可以!!!”
        首先,为了简化说明过程,我们要明确一下任务,现在假设有一个我们自定义的文件类型 .abc ;还有一个VB程序。当我们双击自定义文件 .abc的图标,或者我们将图标拖到程序图标的时候,我们要求程序能够自动启动,同时获得 .abc文件的文件名,这样,就能对这个文件进一步操作了。(为了说明问题,我们假设,当程序自动运行后将文件名作为窗体的标题,当然,你也能获得文件名后,用你的程序打开这个文件。)
       好了,下面就开始编写程序了。第一个要解决的问题就是如何用程序将.abc文件和我们的VB程序“关联”起来呢?在这里,我们使用修改“注册表”的方法来实现文件关联。让我们先定义一个模块,在模块中定义一些常量和API函数。
    (以下常数要使用到的,我会加以说明)
      
    Option Explicit
    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 HKEY_CURRENT_CONFIG = &H80000005
    Public Const HKEY_DYN_DATA = &H80000006
    (以上函数是一些注册表的常量,用来定义 hKey)Enum ValueType
    REG_NONE = 0
    REG_SZ = 1
    REG_EXPAND_SZ = 2
    REG_BINARY = 3
    REG_DWORD = 4
    REG_DWORD_BIG_ENDIAN = 5
    REG_MULTI_SZ = 7
    End Enum
    (这个枚举是用来定义 dwType) Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, 
    phkResult As Long) As Long    '这个函数是用来创建注册表的主键
    Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long   '这个函数用来关闭打开的注册表
    Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long  '这个函数用来改写注册表的键值相关的三个API函数是:RegCreateKey[建立SubKey]和RegClose[关闭SubKey]
    详细说明:
    RegCreateKey函数:
    VB声明 Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" 
    (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As LonghKey:Key Handle
    lpSubKey:SubKey名称或路径
    phkResult:若RegOpenKey执行成功,则这一参数返回Subkey的hKey.
    返回值: =0,表示成功;≠0,表示失败。[注意这一点与别的API函数不太一样]它的参数用法与RegOpenKey一样。所不同的是RegOpenKey只能打开已经有的SubKey,而RegCreateKey则可以建立SubKey,比较特别的是,如果调用RegCreateKey所建立的SubKey是一个已经存在的SubKey,则它的功能和RegOpenKey相同。由于RegCreateKey的这种特性,有的程序员干脆不用RegOpenKey,而用RegCreateKey来统一代替RegOpenKey。RegClose函数:
    Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long 
    当我们不再存取Registry时,将打开或建立的SubKey关闭是一个比较好的习惯,就正如我们在使用C语言的文件打开函数后必须要关闭一样。Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long 
    hKey:Key Handle
    lpSubKey:Subkey名称或路径
    dwType:数据类型,但在这里只能接受REG_SZ[字符串类型]
    lpData:所设置的字符串
    cbData:lpData字符串的长度,这一长度包括chr(0)字符。
    关于dwType的可能取值有了这些注册表的操作函数后,我们就开始定义我们的文件类型了。这个过程其实很简单的。
    1.在注册表中定义 .abc 文件 说明这个文件的类型是用户文件 "userfile"
    2.在注册表的"userfile"中定义打开这种文件的程序(就是我们的VB程序!)具体的源代码如下:
    Sub Main()
    Dim ret As Long, hKey As Long, ExePath As String
    ret = RegCreateKey(HKEY_CLASSES_ROOT, ".abc", hKey)  '定义 .abc文件
    ret = RegSetValue(HKEY_CLASSES_ROOT, ".abc", REG_SZ, "userfile", 9) '定义文件的类型,注意最后一个数字,它是 "userfile"的字节数 + 1
    ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile", hKey)           '定义"userfile"
    ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile\shell", hKey)      '定义它的操作
    ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile\shell\open", hKey)  '具体定义操作的名称 
    ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile\shell\open\command", hKey) '定义操作的动作
    ExePath = App.Path & "\" & App.EXEName & ".exe %1"         '获得VB程序名称
    ret = RegSetValue(HKEY_CLASSES_ROOT, "userfile\shell\open\command", REG_SZ, ExePath, LenB(StrConv(ExePath, vbFromUnicode)) + 1)
    '最关键的一步!将 "userfile" 的打开(open)操作和我们的程序关联起来
    RegCloseKey hKey
    End Sub 
       这样,当我们以后双击 .abc的图标以后,就能自动打开我们的VB程序了。当然,这样只能实现打开程序,程序怎么能知道我们双击的文件名呢?好,我们现在创建一个窗体来说明一下这个问题。
    在加载窗体的时候,加上这样的源代码:Private Sub Form_Load()
    Dim ss As String    '定义一个字符变量
    ss = Command()      '最关键的一步!用这个函数来获得命令行参数!!就是上面提到的 "%1" ,换句话来说,就是文件名!
    Me.Caption = ss     '好了,窗体上面就是你的文件名了!(当然,有了文件名,想干什么,你就自己决定吧!)
    End Sub        当然,你先要判断一下程序是不是第一次运行,如果是第一次运行的话,在加载窗体前,先执行一下 Sub Main(),进行文件的关联。
           好了,学会后,你就能在程序中使用自定义的文件了,或许某一天,.mp3的默认打开方式就是你编写的播放器了。
         以上代码保存于: SourceCode Explorer(源代码数据库)
               复制时间: 2005-08-20 20:57:28
               软件版本: 1.0.870
               软件作者: Shawls
                 E-Mail: [email protected]
                     QQ: 9181729