2012-02-10 1 views
12

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

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

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» - CtrlClick на результате приводит нас к Winapi.DirectShow9 (в папке RTL), который не имеет это поле объявлено.

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

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

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

+0

вы пробовали добавлять блок DirectShow9.pas к пакету? Я помню, что у меня была такая же проблема некоторое время назад, но я пытался установить ее в D2010, мне удалось исправить ее с минимальными изменениями, но я не помню, как я это сделал, это почти 2 года): – ComputerSaysNo

+0

О, да, попробовал это тоже. Я уточню вопрос. – gabr

+0

блин ... Я беспокоюсь, что они что-то сломали в XE2 ... вы пытались установить его в D2010? – ComputerSaysNo

ответ

3

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

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

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

+0

Интересно, я думал, что у меня есть новый DSPack. На самом деле я был уверен в этом. В конце я тоже пошел с комментарием. – gabr

Смежные вопросы