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++環境下修改公司名和用戶名。
{
// 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++環境下修改公司名和用戶名。
解决方案 »
- Microsoft.XMLDOM的问题,求指教啊
- 高手救命
- 问一个问题,散分!
- 在 API Text Viewer 查不到的API函数定义还有什么办法可以获得呢?
- 新手向各位高手求助,在线等 , 立马给分!
- 自定义类型不能作为参数传递吗? 急 !!!!!
- 找杭州兼职VB程序员
- alee201(alee),wzzwwz(棒子面窝头)进来拿分
- 当 MSHFlexGrid 的滚动条到最低下了,单击小箭头,还能再相应一个事件吗??
- 各位大哥大姐,帮帮忙,100分奉送
- 询问:关于图形
- 急急急急急高分求结果我用dataenvironment作了一些text 文本框,用来添加个人资料可是当修改以前资料时如果把text.text中的内容清空后执
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
症状:非法读操作,并没有按照设定的出错办法处理。
求在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
Rc = RegSetValueEx(hKey, SubKeyName, 0, REG_SZ, ByVal StrTmp, LenB(StrConv(SubKeyValue, vbFromUnicode)))此句返回值不是ERROR_SUCCESS,即使最后一个参数加1也不行
出问题的原因是调用GetCommandLineAPI时,在WIN2000下返回的字符串长度达到84K,超出注册表允许的16K长度限制,里面含有大量越界字符
此API在WIN98下工作正常。谢谢各位,并提醒大家,调用API的时候不要尽信它能返回正确的结果。