我正在尝试编译包含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'-结果上的CtrlClick将我们带到Winapi.DirectShow9(在RTL文件夹中),其中没有声明此字段。
有趣的部分-如果转到“ DSUtils使用”列表,请单击DirectShow9并按Ctrl + Enter,将打开该单元的DSpack版本(并且该单元已定义了FrameRateCode字段)。因此,Delphi知道单位在哪里。它只是尝试使用错误的DirectShow9来编译软件包。
有趣的花絮:如果我正在编译使用DSUtils的普通应用程序(非软件包),则一切正常。
我尝试过的
将来自DSPack的DirectShow9编译到其自己的包中(实际上,我使用了来自DSPack的DirectX9包,其中包含DirectX9文件夹中的所有文件),并将其添加到“需要”列表中。不起作用
将包含DirectShow9文件的文件夹(来自DSPack)添加到系统路径的开头并重新启动。不起作用
将包含DirectShow9文件的文件夹添加到库路径的开头。不起作用
使用显式路径将DirectShow9单元添加到包中。不起作用
将DirectX9 * .pas复制到DSPack文件夹中,以便DirectShow9单元与DSUtils单元位于同一文件夹中。不起作用
我看到了三种可能的解决方法,但我对其中任何一种都不满意。
我可以注释掉有问题的代码。幸运的是,只有这一行,其他所有内容都可以使用Delphi的DirectShow9进行编译。
我可以从DSPack重命名DirectShow9,但是随后我可能不得不在其他应用程序中修复“用途”部分。
我可以使用“ Winapi”关闭自动前缀。但这将导致我进行大量其他工作来编辑成千上万个文件。
我真正想看到的是让XE2使用正确的源文件。
最佳答案
我遇到了同样的问题,我只是注释掉了所有问题行(其中有2或3条)。一切正常。
另一个选择是使用最新的DSPack(与XE2兼容):http://code.google.com/p/dspack/
或者,您可以重命名DSPack的DirectShow9文件,如下所述:http://www.progdigy.com/forums/viewtopic.php?p=16971