Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Can';在XE2中编译包含DSUtils的包_Delphi_Delphi Xe2 - Fatal编程技术网

Delphi Can';在XE2中编译包含DSUtils的包

Delphi Can';在XE2中编译包含DSUtils的包,delphi,delphi-xe2,Delphi,Delphi Xe2,我试图编译一个包含DSUtils.pas(的一部分)的包,但它失败了,因为它试图编译错误的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} {$BOOLE

我试图编译一个包含DSUtils.pas(的一部分)的包,但它失败了,因为它试图编译错误的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;
未声明的是“FrameRateCode”-点击结果,我们会看到Winapi.DirectShow9(在RTL文件夹中),它没有声明此字段

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

有趣的小贴士:如果我正在编译一个使用DSUtils的普通应用程序(非包),那么一切都正常

我所尝试的:

  • 将DSPack中的DirectShow9编译到自己的包中(实际上我使用了DSPack中的DirectX9包,其中包含DirectX9文件夹中的所有文件),并将其添加到“requires”列表中。不起作用

  • 将带有DirectShow9文件的文件夹(来自DSPack)添加到系统路径的开头并重新启动。不起作用

  • 将包含DirectShow9文件的文件夹添加到库路径的开头。不起作用

  • 将DirectShow9单元添加到具有显式路径的包中。不起作用

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

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

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

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

  • 我可以关闭“Winapi”的自动前缀功能。但这会导致我在编辑成千上万的文件时需要做大量额外的工作


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

    我面临着同样的问题,我只是简单地注释掉了所有的问题行(有两三行)。一切都很好

    另一种选择是使用最新的DSPack(与XE2兼容):


    或者,您可以重命名DSPack的DirectShow9文件,如下所述:

    您是否尝试将DirectShow9.pas单元添加到包中?我记得不久前我也遇到过同样的问题,但我试着在D2010中安装它,我已经设法用最小的改动来修复它,但我不记得我是怎么做到的,差不多2年了):哦,是的,我也尝试过这个。我会更新问题的。该死的。。。我担心他们在XE2中弄坏了什么。。。您是否尝试将其安装到D2010中?可能是因为以前的版本没有DirectShow9?我假设如果它是与XE2一起交付的,那么它将在您的包使用的包中,并且.dcp将选择这些包中的一个。因此,将该单元的名称更改为DSPack.DirecthShow9.pas,并使用完全限定的名称。不确定这是否立即有效,但它肯定会给您一个提示。强制编译正确单元的一种方法是重命名它并为其添加别名,例如,将DirectShow9.pas重命名为DirectShow9xe2.pas,然后添加别名DirectShow9=directshow9xe2interest,我还以为我有新的DSPack。事实上,我是肯定的。最后,我也采用了“不发表评论”的方法。