为什么我的注册表写入报告没有错误但没有效果?

时间:2014-04-22 01:26:48

标签: delphi winapi registry delphi-7

我正在尝试在安装服务时创建新的系统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.

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

可以想到以下可能的故障模式:

  1. 您的流程没有清单,因此已进行虚拟化。写入成功但数据落在虚拟存储中。
  2. 您的流程有清单但不会提升。该过程未虚拟化。因此,在HKLM下打开密钥以进行写入的尝试会失败,但您的代码无法报告该错误。
  3. 进程为32位,因此访问被重定向到注册表的32位视图。写入成功但数据落在HKLM\Software\Wow6432Node下的32视图中。
  4. 您需要一个应用程序清单来避免虚拟化。您需要使用requireAdministrator的{​​{1}}设置。

    使用requestedExecutionLevel指定从32位程序访问64位视图。