Подтвердить что ты не робот

Невозможно скомпилировать пакет, содержащий DSUtils в XE2

Я пытаюсь скомпилировать пакет, содержащий DSUtils.pas(часть DSPack), и он терпит неудачу, потому что он пытается скомпилировать неверный DirectShow9.pas - не тот из DSPack, а один из RTL Delphi XE2 (обновление 3).

Проблема может быть повторена с минимальным пакетом:

package Package1;

{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DEFINE DEBUG}
{$ENDIF IMPLICITBUILDING}
{$IMPLICITBUILD ON}

requires
  rtl;

contains
  DSUtils in 'x:\common\pkg\dspack\src\DSPack\DSUtils.pas';

end.

Ошибка возникает в строке 1058 DSUtils, а ошибка - Undeclared identifier: FrameRateCode.

Result.FrameRateCode := (x and $00000003) shr 00;

Undeclared - это "FrameRateCode" - CtrlClick в результате приводит нас к Winapi.DirectShow9 (в папке RTL), который не имеет этого поля.

Интересная часть - если я перейду в список использования DSUtils, нажмите DirectShow9 и нажмите Ctrl + Enter, откроется версия DSpack устройства (и этот блок имеет определенное поле FrameRateCode). Поэтому Дельфи знает, где находится единица. Он просто пытается скомпилировать пакет, используя неправильный DirectShow9.

Интересный лакомый кусочек: если я компилирую обычное приложение (не-пакет), использующее DSUtils, все работает нормально.

Что я пробовал:

  • Компиляция DirectShow9 из DSPack в собственный пакет (на самом деле я использовал пакет DirectX9 из DSPack, который содержит все файлы из папки DirectX9) и добавив его в список "требуется". Не работает.

  • Добавление папки с файлом DirectShow9 (из DSPack) в начало системного пути и перезагрузка. Не работает.

  • Добавление папки с файлом DirectShow9 в начало пути к библиотеке. Не работает.

  • Добавление модуля DirectShow9 в пакет с явным путем. Не работает.

  • Скопируйте DirectX9 *.pas в папку DSPack, чтобы блок DirectShow9 находился в той же папке, что и блок DSUtils. Не работает.

Я вижу три возможных обходных решения, но я не доволен ни одним из них.

  • Я могу прокомментировать проблемный код. К счастью, это только одна строка, все остальное компилируется с помощью Delphi DirectShow9.

  • Я могу переименовать DirectShow9 из DSPack, но потом мне, возможно, придется исправить часть "uses" в другом приложении.

  • Я могу отключить автоматическое префикса с помощью "Winapi". но это вызовет у меня много дополнительной работы по редактированию тысяч и тысяч файлов.

То, что я действительно хотел бы увидеть, - это заставить XE2 использовать правильный исходный файл.

4b9b3361

Ответ 1

У меня возникла та же проблема, и я просто прокомментировал все проблемные строки (их было 2 или 3). Все работает отлично.

Другой вариант - использовать новейший DSPack (который совместим с XE2): http://code.google.com/p/dspack/

Или вы можете переименовать файл DSPack DirectShow9, как описано здесь: http://www.progdigy.com/forums/viewtopic.php?p=16971