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

Delphi 使用DLL的应用程序中System.pas中的全局变量,delphi,dll,global-variables,right-to-left,Delphi,Dll,Global Variables,Right To Left,如果Delphi应用程序使用DLL(也使用Delphi创建),System.pas中声明的变量是否有多个版本 我刚刚读过,注释解释了可能有多个版本,例如System.IsConsole,它们具有不同的值-在EXE中为True,在DLL中为False(如果它是使用$APPTYPE CONSOLE编译的) 但其他变量似乎是为应用程序范围的值设计的,例如 MainInstance: LongWord; { Handle of the main(.EXE) HInstance } CPUCount:

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

我刚刚读过,注释解释了可能有多个版本,例如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.IsConsole不是

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

main实例在dll中为0,否?是,@Sertac。System.pas基本上是这样做的:
IsLibrary:=main实例=0