如果Delphi应用程序使用DLL(也是用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不是?
答案 0 :(得分:9)
除非您将DLL与RTL.bpl或用户定义的包含系统单元的“主”BPL链接,否则您的DLL将拥有自己的一组全局系统变量。它们在加载DLL时初始化。 CPUCount不需要EXE来填充它。 DLL通过向Windows询问其值来填充它。 DLL也有自己的IsMultiThread变量(除非你将你的DLL链接到RTL.bpl ...)。所以你的EXE可以有多个线程,而DLL的IsMultiThread变量仍然是False。