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


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

Задачу можно повторить с минимальным пакетом:

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:commonpkgdspacksrcDSPackDSUtils.pas';

end.

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

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

Undeclared is 'FrameRateCode' - CtrlClick on the Result приводит нас к Winapi.DirectShow9 (в RTL папка), в которой это поле не объявлено.

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

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

Что у меня есть пробовал:

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

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

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

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

  5. Копирование DirectX9*.вставьте его в папку DSPack, чтобы модуль DirectShow9 находился в той же папке, что и модуль DSUtils. Не работает.

Я вижу три возможных обходных пути, но ни один из них меня не устраивает.
  1. Я могу прокомментировать проблемный код. К счастью, это только одна строка, все остальное компилируется с Delphi'S DirectShow9.

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

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

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

1 12

1 ответ:

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

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

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