我正在尝试在安装服务时创建新的系统DSN条目。我尝试通过TRegistry.OpenKey和TRegistry.WriteString写入注册表来完成此操作,但没有写入任何值。我写的三个键中的第一个工作正常。
const
sODBCRegKeyLoc = '\SOFTWARE\ODBC\ODBC.INI\OBDC Data Sources';
sServerRegKeyLoc = '\SOFTWARE\ODBC\ODBC.INI\DSN Name';
rInstall := TRegistry.Create(KEY_READ or KEY_WRITE);
try
rInstall.RootKey := HKEY_LOCAL_MACHINE;
if rInstall.OpenKey(sRegKeyLoc, True)
then
begin
rInstall.WriteString('Description', 'Monitors for new log entries. Allows modification');
rInstall.CloseKey;
end; //This call works fine.
if rInstall.OpenKey(sODBCRegKeyLoc, True)
then
begin
rInstall.WriteString('DSN Name', 'SQL Native Client');
end; //This call fails with no error message.
if rInstall.OpenKey(sServerRegKeyLoc, True)
then
begin
rInstall.WriteString('Driver','c:\Windows\system32\sqlncli.dll');
rInstall.WriteString('Server','serverIP\SQLEXPRESS');
rInstall.WriteString('Database', 'Databasename');
end; //This call fails with no error message.
finally
rInstall.Free;
end; //Write values to registry.
任何帮助都将不胜感激。
答案 0 :(得分:0)
可以想到以下可能的故障模式:
HKLM
下打开密钥以进行写入的尝试会失败,但您的代码无法报告该错误。 HKLM\Software\Wow6432Node
下的32视图中。 您需要一个应用程序清单来避免虚拟化。您需要使用requireAdministrator
的{{1}}设置。
使用requestedExecutionLevel
指定从32位程序访问64位视图。