读注册表
数据源信息存放在
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
驱动程序信息存放在
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
附:
HKEY hKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"
SOFTWARE\\ODBC\\ODBC.INI
"
,
0
,KEY_READ,
&
hKey);
DWORD dwSubKeyCount,dwMaxSubKeyNameLength;
RegQueryInfoKey(hKey,NULL,NULL,NULL,
&
dwSubKeyCount,
&
dwMaxSubKeyNameLength,NULL,NULL,NULL,NULL,NULL,NULL);
long
index
=
0
;
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
char
*
szSubKeyName
=
new
char
[dwMaxSubKeyNameLength
+
1
];
DWORD dwSubKeyName;
for
(index
=
0
;index
<
(
long
)dwSubKeyCount;index
++
)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
RegEnumKeyEx(hKey,index,szSubKeyName,&dwSubKeyName,NULL,NULL,NULL,NULL);
}
RegCloseKey(hKey);
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"
SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources
"
,
0
,KEY_READ,
&
hKey);
DWORD dwValueCount,dwMaxValueNameLength;
RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,
&
dwValueCount,
&
dwMaxValueNameLength,NULL,NULL,NULL);
char
*
szValueName
=
new
char
[dwMaxValueNameLength
+
1
];
DWORD dwValueName;
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
for
(index
=
0
;index
<
(
long
)dwValueCount;index
++
)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
RegEnumValue(hKey,index,szValueName,&dwValueName,NULL,NULL,NULL,NULL);
}
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
RegCloseKey(hKey);
hKey
当前打开键的句柄或下列预定义保留的句柄值:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
samDesired
制定一个访问标记以描述访问新键的安全性
此参数可以是下列值的一个联合
KEY_ALL_ACCESS
KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, 和 KEY_SET_VALUE 访问的联合.
KEY_CREATE_LINK
允许创建严格符号的链接.
KEY_CREATE_SUB_KEY
允许创建子键.
KEY_ENUMERATE_SUB_KEYS
允许枚举子键.
KEY_EXECUTE
允许读访问.
KEY_NOTIFY
允许改变通知.
KEY_QUERY_VALUE
允许查询子键的数据.
KEY_READ
KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, 和 KEY_NOTIFY 访问的联合.
KEY_SET_VALUE
允许设置子键的数据.
KEY_WRITE
KEY_SET_VALUE 和 KEY_CREATE_SUB_KEY 访问的联合.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
LONG RegOpenKeyEx(
HKEY hKey,
//
待打开的键的句柄
LPCTSTR lpSubKey,
//
待打开的子键名称的地址
DWORD ulOptions,
//
保留的,必须为0.
REGSAM samDesired,
//
安全访问标记
PHKEY phkResult
//
待打开的键的句柄的地址
);
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
LONG RegQueryInfoKey(
HKEY hKey,
//
待查询的键的句柄
LPTSTR lpClass,
//
类字符串缓冲器地址
LPDWORD lpcbClass,
//
类字符串缓冲器大小的地址
LPDWORD lpReserved,
//
保留的,必须为 NULL.
LPDWORD lpcSubKeys,
//
子键数目缓冲器的地址
LPDWORD lpcbMaxSubKeyLen,
//
最长的子键名称长度缓冲器的地址
LPDWORD lpcbMaxClassLen,
//
最长的类字符串长度缓冲器的地址
LPDWORD lpcValues,
//
值项数目缓冲器的地址
LPDWORD lpcbMaxValueNameLen,
//
最长的值名称长度缓冲器的地址
LPDWORD lpcbMaxValueLen,
//
最长的值数据长度缓冲器的地址
LPDWORD lpcbSecurityDescriptor,
//
安全描述符长度缓冲器的地址
PFILETIME lpftLastWriteTime
//
最近写入时间缓冲器的地址
);
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
LONG RegEnumKeyEx(
HKEY hKey,
//
待枚举的键的句柄
DWORD dwIndex,
//
待枚举的子键的索引
LPTSTR lpName,
//
子键名称缓冲器的地址
LPDWORD lpcbName,
//
子键缓冲器大小的地址
LPDWORD lpReserved,
//
保留的,必须为 NULL.
LPTSTR lpClass,
//
类字符串缓冲器的地址
LPDWORD lpcbClass,
//
类缓冲器大小的地址
PFILETIME lpftLastWriteTime
//
键的最近写入时间的地址
);