2011-08-25 58 views
4

如果Delphi应用程序使用DL​​L(也是用Delphi创建的),那么会在System.pas中声明变量的多个版本吗?在使用DLL的应用程序中的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

MainInstance在dll中是0,否? –

+1

是的@Sertac。 * System.pas *本质上是这样的:'IsLibrary:= MainInstance = 0'。 –

回答

9

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

相关问题