[FAQ]VC读取数据源列表和驱动程序列表

本文介绍如何通过Windows注册表读取ODBC数据源及驱动程序信息的方法,包括使用API函数RegOpenKeyEx、RegQueryInfoKey和RegEnumKeyEx来枚举HKEY_LOCAL_MACHINESOFTWAREODBCODBC.INI与HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INI下的子键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读注册表   
   
数据源信息存放在  
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI   
    
驱动程序信息存放在   
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI  

附:

None.gif    HKEY hKey;
None.gif    RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\ODBC\\ODBC.INI",0,KEY_READ,&hKey);
None.gif    
None.gif    DWORD dwSubKeyCount,dwMaxSubKeyNameLength;
None.gif    RegQueryInfoKey(hKey,NULL,NULL,NULL,
&dwSubKeyCount,&dwMaxSubKeyNameLength,NULL,NULL,NULL,NULL,NULL,NULL);
None.gif    
None.gif    
long index = 0;
None.gif
None.gif    
char* szSubKeyName = new char[dwMaxSubKeyNameLength+1];
None.gif    DWORD dwSubKeyName;
None.gif    
for (index=0;index<(long)dwSubKeyCount;index++)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif        RegEnumKeyEx(hKey,index,szSubKeyName,
&dwSubKeyName,NULL,NULL,NULL,NULL);
ExpandedBlockEnd.gif    }

None.gif    RegCloseKey(hKey);
None.gif
None.gif    RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources",0,KEY_READ,&hKey);
None.gif    
None.gif    DWORD dwValueCount,dwMaxValueNameLength;
None.gif    RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,
&dwValueCount,&dwMaxValueNameLength,NULL,NULL,NULL);    
None.gif    
None.gif    
char* szValueName = new char[dwMaxValueNameLength+1];
None.gif    DWORD dwValueName;
None.gif
None.gif    
for (index=0;index<(long)dwValueCount;index++)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif        RegEnumValue(hKey,index,szValueName,
&dwValueName,NULL,NULL,NULL,NULL);
ExpandedBlockEnd.gif    }

None.gif
None.gif    RegCloseKey(hKey);


None.gif    hKey 
None.gif    当前打开键的句柄或下列预定义保留的句柄值: 
None.gif    HKEY_CLASSES_ROOT
None.gif    HKEY_CURRENT_CONFIG
None.gif    HKEY_CURRENT_USER
None.gif    HKEY_LOCAL_MACHINE
None.gif    HKEY_USERS
None.gif
None.gif    samDesired 
None.gif    制定一个访问标记以描述访问新键的安全性
None.gif    此参数可以是下列值的一个联合 
None.gif    KEY_ALL_ACCESS
None.gif    KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, 和 KEY_SET_VALUE 访问的联合. 
None.gif    KEY_CREATE_LINK
None.gif    允许创建严格符号的链接. 
None.gif    KEY_CREATE_SUB_KEY
None.gif    允许创建子键. 
None.gif    KEY_ENUMERATE_SUB_KEYS
None.gif    允许枚举子键. 
None.gif    KEY_EXECUTE
None.gif    允许读访问. 
None.gif    KEY_NOTIFY
None.gif    允许改变通知. 
None.gif    KEY_QUERY_VALUE
None.gif    允许查询子键的数据. 
None.gif    KEY_READ
None.gif    KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, 和 KEY_NOTIFY 访问的联合. 
None.gif    KEY_SET_VALUE
None.gif    允许设置子键的数据. 
None.gif    KEY_WRITE
None.gif    KEY_SET_VALUE 和 KEY_CREATE_SUB_KEY 访问的联合. 
None.gif
None.gif
None.gif    LONG RegOpenKeyEx(
None.gif    HKEY hKey,                        
// 待打开的键的句柄
None.gif
    LPCTSTR lpSubKey,                // 待打开的子键名称的地址
None.gif
    DWORD ulOptions,                // 保留的,必须为0. 
None.gif
    REGSAM samDesired,                // 安全访问标记
None.gif
    PHKEY phkResult                    // 待打开的键的句柄的地址
None.gif
    );
None.gif
None.gif    LONG RegQueryInfoKey(
None.gif    HKEY hKey,                        
// 待查询的键的句柄
None.gif
    LPTSTR lpClass,                    // 类字符串缓冲器地址
None.gif
    LPDWORD lpcbClass,                // 类字符串缓冲器大小的地址
None.gif
    LPDWORD lpReserved,                // 保留的,必须为 NULL.
None.gif
    LPDWORD lpcSubKeys,                // 子键数目缓冲器的地址
None.gif
    LPDWORD lpcbMaxSubKeyLen,        // 最长的子键名称长度缓冲器的地址
None.gif
    LPDWORD lpcbMaxClassLen,        // 最长的类字符串长度缓冲器的地址
None.gif
    LPDWORD lpcValues,                // 值项数目缓冲器的地址
None.gif
    LPDWORD lpcbMaxValueNameLen,    // 最长的值名称长度缓冲器的地址
None.gif
    LPDWORD lpcbMaxValueLen,        // 最长的值数据长度缓冲器的地址
None.gif
    LPDWORD lpcbSecurityDescriptor,    // 安全描述符长度缓冲器的地址
None.gif
    PFILETIME lpftLastWriteTime        // 最近写入时间缓冲器的地址
None.gif
    );
None.gif
None.gif    LONG RegEnumKeyEx(
None.gif    HKEY hKey,                        
// 待枚举的键的句柄
None.gif
    DWORD dwIndex,                    // 待枚举的子键的索引
None.gif
    LPTSTR lpName,                    // 子键名称缓冲器的地址
None.gif
    LPDWORD lpcbName,                // 子键缓冲器大小的地址
None.gif
    LPDWORD lpReserved,                // 保留的,必须为 NULL.
None.gif
    LPTSTR lpClass,                    // 类字符串缓冲器的地址
None.gif
    LPDWORD lpcbClass,                // 类缓冲器大小的地址
None.gif
    PFILETIME lpftLastWriteTime        // 键的最近写入时间的地址
None.gif
    );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值