我正在尝试编译包含 DSUtils.pas(DSPack的一部分)的软件包,但是由于它尝试编译错误的 DirectShow9.pas 单元 - 不是来自 DSPack 的单元,而是来自 Delphi XE2(更新3)RTL 的单元,因此失败了。
可以使用一个最小的软件包重现这个问题:
Undeclared是“FrameRateCode”- CtrlClick结果会带我们进入Winapi.DirectShow9(在RTL文件夹中),该字段未声明。
有趣的部分-如果我转到DSUtils使用列表,点击DirectShow9并按Ctrl + Enter,则将打开该单元的DSpack版本(该单元定义了FrameRateCode字段)。因此Delphi知道单元所在位置。它只是尝试使用错误的DirectShow9编译包。
有趣的细节:如果我正在编译使用DSUtils的普通应用程序(非包),则一切正常。
我尝试过的内容:
可以使用一个最小的软件包重现这个问题:
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的普通应用程序(非包),则一切正常。
我尝试过的内容:
将DSPack中的DirectShow9编译为自己的包(实际上我使用了DSPack中的DirectX9包,该包包含DirectX9文件夹中的所有文件),并将其添加到“requires”列表中。但是不起作用。
将DirectShow9文件夹(来自DSPack)添加到系统路径的开头,并重新启动。但是不起作用。
将DirectShow9文件夹添加到库路径的开头。但是不起作用。
将DirectShow9单元添加到具有明确路径的包中。但是不起作用。
将DirectX9*.pas复制到DSPack文件夹中,以使DirectShow9单元与DSUtils单元位于同一文件夹中。但是不起作用。
我看到三种可能的解决方法,但我对它们都不满意。
我可以注释掉有问题的代码。幸运的是,只有这一行有问题,其他所有内容都可以使用Delphi的DirectShow9编译。
我可以将DSPack中的DirectShow9重命名,但这样我可能需要在不同的应用程序中修复“uses”部分。
我可以关闭自动添加前缀“Winapi.”,但这会导致我编辑成千上万个文件的额外工作量。
我真正想看到的是让XE2使用正确的源文件。