Не могу скомпилировать пакет, содержащий DSUtils в XE2 - PullRequest
12 голосов
/ 10 февраля 2012

Я пытаюсь скомпилировать пакет, содержащий DSUtils.pas (часть DSPack ), и происходит сбой, потому что он пытается скомпилировать неправильный модуль DirectShow9.pas - не тот, что из DSPack, а тот, что из Delphi XE2 (обновление 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:\common\pkg\dspack\src\DSPack\DSUtils.pas';

end.

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

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

Необъявленным является 'FrameRateCode' - нажатие Ctrl для результата приводит нас к Winapi.DirectShow9 (в папке RTL), для которого это поле не объявлено.

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

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

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

3 голосов
/ 25 февраля 2012

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

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

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

...