Как решить проблему «Нужна ссылка на импортированные данные» при сборке с помощью пакетов времени выполнения

Чтобы помочь нам разделить монолитное приложение на модули, мы находимся в процессе настройки пакетов для использования в отладочных сборках, при этом по-прежнему компилируем в один исполняемый файл для выпускных сборок.

Один из наши пакеты (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 и его друзья являются строками ресурсов?

5
задан Marjan Venema 9 May 2012 в 09:16
поделиться