无法在XE2中编译包含DSUtils的软件包

12
我正在尝试编译包含 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行,错误为未声明的标识符:FrameRateCode

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

Undeclared是“FrameRateCode”- CtrlClick结果会带我们进入Winapi.DirectShow9(在RTL文件夹中),该字段未声明。
有趣的部分-如果我转到DSUtils使用列表,点击DirectShow9并按Ctrl + Enter,则将打开该单元的DSpack版本(该单元定义了FrameRateCode字段)。因此Delphi知道单元所在位置。它只是尝试使用错误的DirectShow9编译包。
有趣的细节:如果我正在编译使用DSUtils的普通应用程序(非包),则一切正常。
我尝试过的内容:
  1. 将DSPack中的DirectShow9编译为自己的包(实际上我使用了DSPack中的DirectX9包,该包包含DirectX9文件夹中的所有文件),并将其添加到“requires”列表中。但是不起作用。

  2. 将DirectShow9文件夹(来自DSPack)添加到系统路径的开头,并重新启动。但是不起作用。

  3. 将DirectShow9文件夹添加到库路径的开头。但是不起作用。

  4. 将DirectShow9单元添加到具有明确路径的包中。但是不起作用。

  5. 将DirectX9*.pas复制到DSPack文件夹中,以使DirectShow9单元与DSUtils单元位于同一文件夹中。但是不起作用。

我看到三种可能的解决方法,但我对它们都不满意。

  1. 我可以注释掉有问题的代码。幸运的是,只有这一行有问题,其他所有内容都可以使用Delphi的DirectShow9编译。

  2. 我可以将DSPack中的DirectShow9重命名,但这样我可能需要在不同的应用程序中修复“uses”部分。

  3. 我可以关闭自动添加前缀“Winapi.”,但这会导致我编辑成千上万个文件的额外工作量。

我真正想看到的是让XE2使用正确的源文件。


你尝试将DirectShow9.pas单元添加到包中了吗?我记得我以前遇到过同样的问题,但当时我是在D2010中安装它,我设法用最少的更改解决了它,但我不记得我是怎么做到的,已经快两年了 ): - user497849
哦,是的,我也试过了。我会更新问题。 - gabr
如果可以的话,我建议不要碰它。在我看来,XE2里出了什么问题,难怪会这样... - user497849
1
之前的版本可能没有DirectShow9吗?我假设如果它随XE2一起提供,它将在您的包使用的包中,并且.dcp将选择这些包中的一个。因此,请将单元的名称更改为DSPack.DirecthShow9.pas并使用该单元,完全限定。不确定是否可以立即解决问题,但肯定会给您提示要做什么。 - Rudy Velthuis
1
强制编译正确单元的一种方法是将其重命名并添加别名,例如将DirectShow9.pas重命名为DirectShow9xe2.pas,然后添加别名DirectShow9 = DirectShow9xe2。 - Lee_Nover
显示剩余9条评论
1个回答

3

有趣的是,我以为我有最新的DSPack。我确实对此非常确定。最后我也采用了注释掉的方法。 - gabr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接