【问题标题】:Can't compile package containing DSUtils in XE2无法在 XE2 中编译包含 DSUtils 的包
【发布时间】:2012-02-10 11:23:49
【问题描述】:

我正在尝试编译一个包含 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;

Undeclared is 'FrameRateCode' - CtrlClick 结果将我们带到 Winapi.DirectShow9(在 RTL 文件夹中),它没有声明此字段。

有趣的部分 - 如果我进入 DSUtils 使用列表,单击 DirectShow9 并按 Ctrl+Enter,该单元的 DSpack 版本将打开(并且该单元已定义 FrameRateCode 字段)。所以德尔福知道单位在哪里。它只是尝试使用错误的 DirectShow9 来编译包。

有趣的花絮:如果我正在编译一个使用 DSUtils 的普通应用程序(非包),一切正常。

我尝试过的:

  1. 将 DSPack 中的 DirectShow9 编译到自己的包中(实际上我使用了 DSPack 中的 DirectX9 包,其中包含 DirectX9 文件夹中的所有文件)并将其添加到“需要”列表中。没用。

  2. 将包含 DirectShow9 文件的文件夹(来自 DSPack)添加到系统路径的开头并重新启动。没用。

  3. 将包含 DirectShow9 文件的文件夹添加到库路径的开头。没用。

  4. 将 DirectShow9 单元添加到具有显式路径的包中。没用。

  5. 将 DirectX9*.pas 复制到 DSPack 文件夹中,以便 DirectShow9 单元与 DSUtils 单元位于同一文件夹中。没用。

我看到了三种可能的解决方法,但我对其中任何一种都不满意。

  1. 我可以注释掉有问题的代码。还好只有这一行,其他的都是用Delphi的DirectShow9编译的。

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

  3. 我可以使用“Winapi”关闭自动前缀。但这会导致我需要大量额外的工作来编辑成千上万的文件。

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

【问题讨论】:

  • 您是否尝试将 DirectShow9.pas 单元添加到包中?我记得我前段时间遇到过同样的问题,但我试图在 D2010 中安装它,我已经设法通过最小的更改来修复它,但我不记得我是如何做到的,已经快 2 年了):
  • 哦,是的,这个也试过了。我会更新问题。
  • 该死...我担心他们在 XE2 中破坏了某些东西...您尝试将其安装到 D2010 中吗?
  • 会不会是以前的版本没有DirectShow9?我假设如果它与 XE2 一起交付,它将在您的包使用的包中,并且 .dcp 将选择这些包中的那个。因此,将单元的名称更改为 DSPack.DirecthShow9.pas 并使用完全限定的那个。不确定这是否会立即生效,但它肯定会给你一个提示。
  • 强制编译正确单元的一种方法是重命名它并为其添加别名,例如。将 DirectShow9.pas 重命名为 DirectShow9xe2.pas 然后添加别名 DirectShow9=DirectShow9xe2

标签: delphi delphi-xe2


【解决方案1】:

我遇到了同样的问题,我只是将所有问题行注释掉(其中有 2 或 3 个)。一切正常。

另一种选择是使用最新的 DSPack(与 XE2 兼容):http://code.google.com/p/dspack/

或者您可以重命名 DSPack 的 DirectShow9 文件,如下所述:http://www.progdigy.com/forums/viewtopic.php?p=16971

【讨论】:

  • 有趣,我以为我有新鲜的 DSPack。我其实很确定这一点。最后我也采用了注释掉的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多