Delphi的“环境变量”如$(BDS)如何评估?

时间:2011-07-29 08:06:50

标签: delphi path environment-variables

我正在为我们的内部库做一些整洁的安装程序(而不是仅仅打开DPK并单击“安装”并稍后弄乱......)这使我必须了解如何获得各种库Delphi变量,如Known Packages,注册表RootDir值等。

我看到在Delphi中有许多变量你可以使用(例如在搜索路径中),例如$(BDS)等。当我查看我的机器环境变量时,我不会在系统中看到这些变量或当前用户。

我的问题是:

  1. Delphi是否正在做内部扩展$(BDS)等本身?或者我可以以某种方式在外部使用这些(例如在注册表中查找)。
  2. 为什么符号$(xxxx)在搜索路径中而不是%xxxx%与envirnment变量一样? 感谢

5 个答案:

答案 0 :(得分:22)

1)它们只是Delphi为其自己的流程设置的环境变量,您可以使用安装在IDE中的设计包中的GetEnvironmentStrings检索它们;这是an example

如果你的安装程序是一个单独的可执行文件,你仍然可以(或多或少地)猜测从哪里得到一些值:

    注册表中的
  • BDSRootDir值,例如HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\8.0\
  • BDSCOMMONDIR:旧版本(Delphi 2007,我猜)这是一个全局环境变量,由Delphi安装程序设置。在以后的版本中,您可以在rsvars.bat
  • 中找到它

其他一些可能是衍生出来的,例如:

  • BDSLIB$(BDS)\lib
  • BDSINCLUDE$(BDS)\include

用户定义的变量(在Delphi的“环境选项”对话框中定义)存储在Environment Variables注册表子项中。

2)$(...)符号恕我直言更好,因为它有明显的开始和结束分隔符,更容易使用搜索/替换操作,也更易读。

答案 1 :(得分:6)

我正在进行一些命令行构建自动化(因为我想要离开Final Builder),所以我不得不处理这些特殊变量。要调用命令行编译器,我们应该使用“开始”菜单中的“RAD Studio命令提示符”调用命令提示符,或者将“rsvars.bat”脚本包含在我们自己的脚本中。

rsvars.bat脚本如下所示:

@SET BDS=C:\Program Files (x86)\Embarcadero\RAD Studio\7.0
@SET BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\7.0
@SET FrameworkDir=C:\Windows\Microsoft.NET\Framework\v2.0.50727
@SET FrameworkVersion=v2.0.50727
@SET FrameworkSDKDir=
@SET PATH=%FrameworkDir%;%FrameworkSDKDir%;%PATH%
@SET LANGDIR=EN

正如您所注意到的那样,在那里设置了非常特殊的BDS变量,以及其他一些变量。 BDS路径与注册表中的BDS安装路径相对应,但我决定从rsvars.bat脚本中读取它,希望它能更好地面向未来。所以我基本上将.bat文件读成TStringList并且我正在应用一个简单的RegEx来识别分配。

扩展那些$(Nam)样式表达式的例程包括DELPHI名称的特殊情况,以处理Delphi7:如果我看到了,我将其替换为IDE的安装路径。

答案 2 :(得分:6)

变量的$()表示法是MAKE使用的约定,Borland在切换到MSBuild之前用作构建工具。 (在D2007?)

答案 3 :(得分:1)

David认为这些变量特定于Delphi(和C ++ Builder),并且它们不能作为“普通”环境变量使用。

但是,可以在注册表中查找它们。关键是:HKCU\Software\<Borcadero>\BDS\<version>\Environment Variables

您添加的任何自定义“环境”变量也可以在此处找到。例如,我有一个$(MVC)变量指向可以找到所有组件('版本)的文件夹。

在工作中,我们使用注册表在脚本/应用程序组合中查找值,以将dprojs转换为使用命令行编译器的构建服务器的cfg文件。 (因为我们不在构建机器上使用IDE,所以我们已经手动将自定义Delphi环境变量添加到注册表中。)

更新

实际上,Environment Variables键用于用户定义的环境变量以及“标准”BDS环境变量的覆盖。任何$(BDS *)环境变量的默认值都无法在注册表中找到...

因此,当前的知识说,如果你想要了解$(BDS *)变量的值,你必须覆盖默认值并读取你从环境变量键中指定的值。

答案 4 :(得分:-1)

谢谢,我想我要补充一点,当我创建一个新的环境变量-(将在DCC_UnitSearchPath中用作$(VISEMS))时,我发现它已放入注册表中。

对于一个特定的示例,我在以下位置找到了它: 计算机\ HKEY_CURRENT_USER \软件\ Embarcadero \ BDS \ 17.0 \环境变量

需要更新上面的“可接受的答案”以反映注册表路径中存在版本号,因为在我的情况下,“可接受的答案”不正确(当它说:HKEY_CURRENT_USER \ SOFTWARE \ Embarcadero \ BDS \ 8.0 \) 因为“ BDS \ 8.0”上没有任何内容,因为我的计算机上尚未安装8.0。