System.pas中的全局变量在使用DLL的应用程序中

时间:2011-08-25 10:04:30

标签: delphi dll global-variables right-to-left

如果Delphi应用程序使用DL​​L(也是用Delphi创建的),System.pas中是否会有多个版本的变量声明?

我刚刚阅读How to determine if I'm running as a console app? (Delphi on Win32)并且评论解释说可能存在多个版本,例如System.IsConsole,它们具有不同的值 - 在EXE中为True,在DLL中为False(如果使用它编译的话) $ APPTYPE CONSOLE)。

但其他变量似乎是针对应用程序范围的值设计的,例如

MainInstance: LongWord;   { Handle of the main(.EXE) HInstance }
CPUCount: Integer;       { Number of CPU Cores detected }

开发人员如何看待在应用程序级别分配哪些值,哪些变量是特定于模块的(因此在DLL和EXE中可以有不同的值)?

或者我是否误解了这些全局变量?例如,System.BeginThread的文档说它设置了全局变量System.IsMultiThread - 但它怎么可能是全局变量而System.IsConsole不是?

1 个答案:

答案 0 :(得分:9)

除非您将DLL与RTL.bpl或用户定义的包含系统单元的“主”BPL链接,否则您的DLL将拥有自己的一组全局系统变量。它们在加载DLL时初始化。 CPUCount不需要EXE来填充它。 DLL通过向Windows询问其值来填充它。 DLL也有自己的IsMultiThread变量(除非你将你的DLL链接到RTL.bpl ...)。所以你的EXE可以有多个线程,而DLL的IsMultiThread变量仍然是False。

相关问题