Чтобы помочь нам разделить монолитное приложение на модули, мы находимся в процессе настройки пакетов для использования в отладочных сборках, при этом по-прежнему компилируем в один исполняемый файл для выпускных сборок.
Один из наши пакеты (EAUtils) содержат модуль, который теперь производит [Ошибка DCC] E2201 Требуется ссылка на импортированные данные ($G) для доступа к 'SMsgDlgWarning' из модуля 'SystemUtils'
.
Это происходит при построении Сам пакет EAUtils. Я пока не собираю пакеты, зависящие от EAUtils. EAUtils зависит только от пакетов rtl/vcl и пакета, который я создал для модулей Jedi WinApi.
Это результат строк:
// This is a TaskDialog override, with the same args as the old MessageDlg.
function TaskDialog(const aContent: string; const Icon: HICON = 0;
const Buttons: TTaskDialogCommonButtonFlags = TDCBF_OK_BUTTON): Integer;
const
Captions: array[TMsgDlgType] of Pointer = (@SMsgDlgWarning, @SMsgDlgError, @SMsgDlgInformation, @SMsgDlgConfirm, nil);
var
aMsgDlgType: TMsgDlgType;
aTitle: string;
begin
aMsgDlgType := TaskDialogIconToMsgDlgType(Icon);
if aMsgDlgType <> mtCustom then
aTitle := LoadResString(Captions[aMsgDlgType])
else
aTitle := Application.Title;
Подробнее в частности, это результат ссылок SMsgDlgWarning
, SMsgDlgError
, SMsgDlgInformation
и SMsgDlgConfirm
, которые все объявлены в Vcl.Const.
.
Обратите внимание, что этот код компилируется без ошибок, когда мы собираем один исполняемый файл.
В целях оптимизации наш включаемый файл содержит {$IMPORTEDDATA OFF}
, так как это обеспечивает более быстрый доступ к (глобальным) переменным и константам. См. http://hallvards.blogspot.com/2006/09/hack13-access-globals-faster.html.
Согласно документации по ошибке ( http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/cm_package_varref_xml.html) это является причиной и в нем говорится: «Чтобы решить проблему, обычно проще всего включить переключатель $ IMPORTEDDATA и перекомпилировать модуль, вызвавший ошибку».
Итак, я установил {$IMPORTEDDATA ON}
в нашем включаемом файле и сделал двойную уверенность, установив для параметра Использовать импортированные ссылки на данные
значение true в Delphi Compiler | Компиляция | Раздел Debugging
параметров проекта.
К сожалению, вопреки документации, это не решило проблему. Даже установка этой директивы компилятора непосредственно над проблемным кодом и пересборка пакета не устранили ошибки.
Что еще нужно сделать, чтобы устранить эту ошибку E2201? Не уверен, но может иметь значение, что SMsgDlgWarning и его друзья являются строками ресурсов?