Не удается скомпилировать пакет, содержащий 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, все работает нормально.
Что у меня есть пробовал:
-
Компиляция DirectShow9 из DSPack в его собственный пакет (на самом деле я использовал пакет DirectX9 из DSPack, который содержит все файлы из папки DirectX9) и добавление его в список "требуется". Не работает.
-
Добавление папки с файлом DirectShow9 (из DSPack) в начало системного пути и перезагрузка. Не работает.
-
Добавление папки с файлом DirectShow9 в начало пути к библиотеке. Не работа.
-
Добавление модуля DirectShow9 в пакет с явным путем. Не работает.
-
Копирование DirectX9*.вставьте его в папку DSPack, чтобы модуль DirectShow9 находился в той же папке, что и модуль DSUtils. Не работает.
-
Я могу прокомментировать проблемный код. К счастью, это только одна строка, все остальное компилируется с Delphi'S DirectShow9.
-
Я могу переименовать DirectShow9 из DSPack, но тогда мне, возможно, придется исправить часть "uses" в другом приложении.
-
Я могу отключить автоматическую приставку с ' Winapi.- но это вызовет у меня массу дополнительной работы по редактированию тысяч и тысяч файлов.
Что я действительно хотел бы увидеть, так это заставить XE2 использовать правильный исходный файл.
1 ответ:
Я столкнулся с той же проблемой, и я просто прокомментировал все проблемные линии (их было 2 или 3). Все работает отлично.
Другой вариант-использовать последний DSPack (который совместим с XE2): http://code.google.com/p/dspack/
Или вы можете переименовать файл DirectShow9 DSPack, как описано здесь: http://www.progdigy.com/forums/viewtopic.php?p=16971