Глобальные переменные в System.pas в приложениях, которые используют DLL - PullRequest
4 голосов
/ 25 августа 2011

Если приложения Delphi используют библиотеки DLL (также созданные с помощью Delphi), будет ли несколько версий переменных, объявленных в System.pas?

Я только что прочитал Как определить, работаю ли я как консольное приложение? (Delphi на Win32) и комментарий объясняет, что может быть несколько версий, например, System.IsConsole, которые имеют разные значения - True в EXE и False в DLL (если он был скомпилирован с использованием $ 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 Ответ

9 голосов
/ 25 августа 2011

Если вы не связываете свою DLL с RTL.bpl или определяемым пользователем "основным" BPL, который содержит системный блок, ваша DLL будет иметь свой собственный набор глобальных системных переменных. Они инициализируются при загрузке DLL. CPUCount не нуждается в EXE, чтобы заполнить его. DLL заполняет его, спрашивая Windows о его значении. DLL также имеет свою собственную переменную IsMultiThread (если вы не связываете свою DLL с RTL.bpl ...). Таким образом, ваш EXE может иметь несколько потоков, а в переменной DLL IsMultiThread по-прежнему указано False.

...