void CRegistryDlg::OnModify() 
{
// TODO: Add your control notification handler code here
CModify dlg;
if (dlg.DoModal() == IDOK) // 按給定的值修改注冊信息
{
CString str_username = dlg.m_Username;
CString str_company = dlg.m_Company; // 定義有關的hKEY, 程序結束時關閉
HKEY hKEY;
LPCTSTR data_Set = "Software\\Microsoft\\Ms Setup (ACME)\\User Info\\";
long ret0 = ::RegOpenKeyEx(HKEY_CURRENT_USER, // 根鍵名稱
data_Set, // 要訪問的鍵的位置
0, // 必須為0
KEY_WRITE, // 以寫方式訪問注冊表
&hKEY); // hKEY保存此函數所打開的鍵的句柄 // 修改用戶姓名
LPBYTE username_Set = CString_To_LPBYTE(str_username);
DWORD type_1 = REG_SZ;
DWORD cbData_1 = str_username.GetLength() +1;
long ret1 = ::RegSetValueEx(hKEY, // 己打開的鍵的句柄
"DefName", // 要修改的鍵值名
NULL,
type_1, // 新數據的類型
username_Set, // 新的鍵值
cbData_1); // 新值的數據長度 if (ret1 != ERROR_SUCCESS)
{
MessageBox("錯誤:無法修改用戶姓名");
return;
} // 修改公司名稱
LPBYTE company_Set = CString_To_LPBYTE(str_company);
DWORD type_2 = REG_SZ;
DWORD cbData_2 = str_company.GetLength() + 1;
long ret2 = ::RegSetValueEx(hKEY, // 己打開的鍵的句柄
"DefCompany", // 要修改的鍵值名
NULL,
type_2, // 新數據的類型
company_Set, // 新的鍵值
cbData_2); // 新值的數據長度 if (ret2 != ERROR_SUCCESS)
{
MessageBox("錯誤:無法修改公司名稱!");
return;
}
}
}這是在VC++環境下修改公司名和用戶名。

解决方案 »

  1.   

    Option Explicit
    Const HKEY_CLASSES_ROOT = &H80000000
    Const HKEY_CURRENT_USER = &H80000001
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const HKEY_USERS = &H80000003
    Const HKEY_PERFORMANCE_DATA = &H80000004
    Const HKEY_CURRENT_CONFIG = &H80000005
    Const HKEY_DYN_DATA = &H80000006
    Const REG_NONE = 0
    Const REG_SZ = 1
    Const REG_EXPAND_SZ = 2
    Const REG_BINARY = 3
    Const REG_DWORD = 4
    Const REG_DWORD_BIG_ENDIAN = 5
    Const REG_MULTI_SZ = 7Private 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 RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Sub Command1_Click()
    Dim hKey As Long
    Dim DSNName, strDriver, strServer, strDatabase, strLastUser, strDBType As StringDSNName = "myodbc"strDriver = "C:\\WINNT\\System32\\sqlsrv32.dll" 'SQL Server的驱动,如果用VFP可以改成相应的文件
    strServer = "SERVER"
    strDatabase = "test"
    strLastUser = "sa"
    strDBType = "SQL Server"RegCreateKey HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", hKey
    RegSetValueEx hKey, DSNName, 0, REG_SZ, ByVal strDBType, Len(strDBType) + 1RegCreateKey HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBC.INI\" & DSNName, hKey
    RegSetValueEx hKey, "Driver", 0, REG_EXPAND_SZ, ByVal CStr(strDriver), Len(strDriver) + 1
    RegSetValueEx hKey, "Server", 0, REG_SZ, ByVal CStr(strServer), Len(strServer) + 1
    RegSetValueEx hKey, "Database", 0, REG_SZ, ByVal CStr(strDatabase), Len(strDatabase) + 1
    RegSetValueEx hKey, "LastUser", 0, REG_SZ, ByVal CStr(strLastUser), Len(strLastUser) + 1
    End Sub
      

  2.   

    http://www.sqreg.com/file/vb/reg_05.htm
      

  3.   

    我的代码如下,在管理员权限下运行
    症状:非法读操作,并没有按照设定的出错办法处理。
    求在VB下的解决办法。
    '调用EditKey过程
    EditKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run","Khfk",StrTmp, True)Public Function EditKey(KeyRoot As Long, KeyName As String, SubKeyName As String, SubKeyValue As String, EditState As Boolean) As Boolean
                'EditState 为键值的修改状态True 为添加或更改False 删除
      Dim Rc As Long
      Dim hKey As Long
      Dim StrTmp As String
                          '打开指定的键
    On Error GoTo Deal:
      StrTmp = SubKeyValue
      Rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey)
      
      If (Rc <> ERROR_SUCCESS) Then GoTo Deal:
      
      If EditState Then
        Rc = RegSetValueEx(hKey, SubKeyName, 0, REG_SZ, ByVal StrTmp, LenB(StrConv(SubKeyValue, vbFromUnicode)))
      Else
        Rc = RegDeleteValue(hKey, SubKeyName)   '删除键值
      End If
      
      If (Rc <> ERROR_SUCCESS) Then GoTo Deal:
      
      Rc = RegCloseKey(hKey)
      EditKey = True
      Exit Function
    Deal:
        EditKey = False
        Rc = RegCloseKey(hKey)
    End Function
      

  4.   

    但在VB调试环境下可以按照正常的出错方法办理,
    Rc = RegSetValueEx(hKey, SubKeyName, 0, REG_SZ, ByVal StrTmp, LenB(StrConv(SubKeyValue, vbFromUnicode)))此句返回值不是ERROR_SUCCESS,即使最后一个参数加1也不行
      

  5.   

    问题已经解决
    出问题的原因是调用GetCommandLineAPI时,在WIN2000下返回的字符串长度达到84K,超出注册表允许的16K长度限制,里面含有大量越界字符
    此API在WIN98下工作正常。谢谢各位,并提醒大家,调用API的时候不要尽信它能返回正确的结果。