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

Delphi 为什么我的注册表写入报告没有错误但没有效果?,delphi,winapi,registry,delphi-7,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 := TRegi

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

任何帮助都将不胜感激。

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

  • 您的流程没有清单,因此是虚拟化的。写入操作成功,但数据已到达虚拟存储区
  • 您的进程具有清单,但未运行提升。这个过程不是虚拟化的。因此,尝试在
    HKLM
    下打开用于写入的键失败,但您的代码无法报告该错误
  • 进程是32位的,因此访问被重定向到注册表的32位视图。写入成功,但数据会在
    HKLM\Software\Wow6432Node
    下的32视图中着陆 您需要一个应用程序清单来避免虚拟化。您需要使用
    requestedExecutionLevel
    requireAdministrator
    设置


    使用
    KEY\u WOW64\u 64KEY
    指定从32位程序访问64位视图的权限

    第三个是有意义的。让我困惑的是,我可以写这3个键中的第一个键,没问题。只有OBDC.INI下的两个键失败。您正在运行进程吗?程序有清单吗?两者都没有。我回家后会试试的,谢谢你的建议。如果没有清单,则第1项适用。您的应用程序运行虚拟化。虚拟化于2006年推出,作为帮助从XP迁移到Vista的支柱。您不应该在2014年运行虚拟化!你真的需要掌握这一点。