问题描述:之前没有把事情弄清楚,手动通过odbc32位工具添加系统DSN,查询注册表位置,想通过代码方式进行自动注册,反复测试代码返回1注册成功。但是在注册表指定位置和ODBC图形界面就是查询不到,这是因为64为win系统对注册表HKEY_LOCAL_MACHINE键进行了保护,注册表这种全局位置HKEY_LOCAL_MACHINE无法通过代码自动注册,用RegistrySet函数注册后,win系统会自动将注册位置转移到VirtualStore键值下,所以只能调整方案,注册到用户DSN,这样可以实现代码自动注册odbc数据源.
1.通过ODBC界面填写用户DSN后,在注册表查询pb22_sqlite_gui位置如下
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\pb22_sqlite_gui
HKEY_USERS\S-1-5-21-3557486919-341462320-2402416372-1001\Software\ODBC\ODBC.INI\ODBC Data Sources
HKEY_USERS\S-1-5-21-3557486919-341462320-2402416372-1001\Software\ODBC\ODBC.INI\pb22_sqlite_gui
2.用代码自动注册用户DSN成功
//HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources
integer li_rtn
string ls_reg_key = "HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources";
li_rtn = RegistrySet(ls_reg_key, "pb22_sqlite_gui", RegString!, "SQLite3 ODBC Driver" )
3.走过的弯路
通过ODBC界面填写系统DSN后,在注册表查询pb_sqlite_dev位置如下
(无法通过RegistrySet函数自动注册到该位置,因为64位windows有注册表保护机制,会自动注册到**VirtualStore**键值下)
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\ODBC Data Sources
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\pb_sqlite_dev