【问题标题】:Variants recursively uses itself?变体递归地使用自己?
【发布时间】:2011-02-11 21:52:48
【问题描述】:

我正在尝试构建 rtl140.bpl 的调试版本,以便更轻松地调试带有运行时包的应用程序。我构建了 DPK 并在其上运行 DCC32,它进入了一个通道,然后死了。

C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\source\Win32\rtl\sys\Variants.pas(1072) 致命:F2092 程序或单元“变体”递归使用自身

但是查看 Variants.pas,我不知道怎么做。它仅在 interface 部分中使用 SysUtils 和 Types,并且它们都不使用 Variants,或使用任何使用 Variants 的东西。

有人知道为什么会这样吗?

【问题讨论】:

    标签: delphi delphi-2010


    【解决方案1】:

    这是我们(RAD Studio 团队)不建议重新构建核心 rtl 包的主要原因之一。需要非常小心地完成,并且需要按特定顺序在包含部分中列出单位。

    变体有点像“混蛋”单位。编译器对此有特定的了解,因此当它看到 Variant 类型的使用时,它会自动将 Variants 添加到使用列表中,以确保存在对 Variant 类型的实际 RTL 支持。 System.pas 将大多数变体操作推迟到 Variants 单元,但由于 System 不能使用除 SysInit(这也是一个非常特殊的单元)之外的任何其他单元,因此编译器必须参与其中。

    目前,除了尝试重新排列 .dpk 中的包含列表并重试外,我没有任何具体的建议来完成这项工作。这是我们用来构建该包的 rtl.dpk 的包含列表:

    Variants in 'sys\Variants.pas',
    VarUtils in 'sys\VarUtils.pas',
    SysConst in 'sys\SysConst.pas',
    SysUtils in 'sys\SysUtils.pas',
    SyncObjs in 'common\SyncObjs.pas',
    Types in 'sys\Types.pas',
    VCLCom in 'common\VCLCom.pas',
    ComConst in 'common\ComConst.pas',
    ComObj in 'common\ComObj.pas',
    ComObjWrapper in 'common\ComObjWrapper.pas',
    RTLConsts in 'common\RTLConsts.pas',
    Contnrs in 'common\Contnrs.pas',
    ConvUtils in 'common\ConvUtils.pas',
    DateUtils in 'common\DateUtils.pas',
    IniFiles in 'common\IniFiles.pas',
    Masks in 'common\Masks.pas',
    Math in 'common\Math.pas',
    Registry in 'common\Registry.pas',
    StdConvs in 'common\StdConvs.pas',
    StdVCL in 'common\StdVCL.pas',
    StrUtils in 'common\StrUtils.pas',
    TypInfo in 'common\TypInfo.pas',
    VarConv in 'common\VarConv.pas',
    VarCmplx in 'common\VarCmplx.pas',
    Classes in 'common\Classes.pas',
    MaskUtils in 'common\MaskUtils.pas',
    HelpIntfs in 'common\HelpIntfs.pas',
    ScktComp in 'common\ScktComp.pas',
    AccCtrl in 'win\AccCtrl.pas',
    AclAPI in 'win\AclAPI.pas',
    ActiveX in 'win\ActiveX.pas',
    ComSvcs in 'win\ComSvcs.pas',
    ADOInt in 'win\ADOInt.pas',
    AspTlb in 'win\AspTlb.pas',
    COMAdmin in 'win\COMAdmin.pas',
    CommCtrl in 'win\CommCtrl.pas',
    CommDlg in 'win\CommDlg.pas',
    Cpl in 'win\Cpl.pas',
    DDEml in 'win\DDEml.pas',
    Dlgs in 'win\Dlgs.pas',
    DwmApi in 'win\DwmApi.pas',
    FlatSB in 'win\FlatSB.pas',
    ImageHlp in 'win\ImageHlp.pas',
    Imm in 'win\Imm.pas',
    Isapi in 'win\Isapi.pas',
    Isapi2 in 'win\Isapi2.pas',
    LZExpand in 'win\LZExpand.pas',
    Mapi in 'win\Mapi.pas',
    Messages in 'win\Messages.pas',
    MMSystem in 'win\MMSystem.pas',
    msxml in 'win\msxml.pas',
    Mtx in 'win\Mtx.pas',
    MultiMon in 'win\MultiMon.pas',
    Nb30 in 'win\Nb30.pas',
    Ns30Fix in 'win\Ns30Fix.pas',
    Ns35Fix in 'win\Ns35Fix.pas',
    Ns36Fix in 'win\Ns36Fix.pas',
    Nsapi in 'win\Nsapi.pas',
    ObjComAuto in 'common\ObjComAuto.pas',
    ObjAuto in 'common\ObjAuto.pas',
    OleDB in 'win\OleDB.pas',
    OleDlg in 'win\OleDlg.pas',
    OpenGL in 'win\OpenGL.pas',
    oleacc in 'win\oleacc.pas',
    Penwin in 'win\Penwin.pas',
    PsAPI in 'win\PsAPI.pas',
    RegStr in 'win\RegStr.pas',
    RichEdit in 'win\RichEdit.pas',
    ShellAPI in 'win\ShellAPI.pas',
    SHFolder in 'win\SHFolder.pas',
    ShlObj in 'win\ShlObj.pas',
    ShLwApi in 'win\ShLwApi.pas',
    StrHlpr in 'sys\StrHlpr.pas',
    TlHelp32 in 'win\TlHelp32.pas',
    UrlMon in 'win\UrlMon.pas',
    UxTheme in 'win\UxTheme.pas',
    VarHlpr in 'sys\VarHlpr.pas',
    WideStrings in 'common\WideStrings.pas',
    WideStrUtils in 'common\WideStrUtils.pas',
    windows in 'win\windows.pas',
    winInet in 'win\winInet.pas',
    Winsafer in 'win\Winsafer.pas',
    WinSock in 'win\WinSock.pas',
    winSpool in 'win\winSpool.pas',
    winSvc in 'win\winSvc.pas',
    CorError in 'win\CorError.pas',
    CorHdr in 'win\CorHdr.pas',
    Cor in 'win\Cor.pas',
    DXTypes in 'win\DXTypes.pas',
    DXFile in 'win\DXFile.pas',
    DxDiag in 'win\DxDiag.pas',
    D3DX8 in 'win\D3DX8.pas',
    D3DX9 in 'win\D3DX9.pas',
    Direct3D in 'win\Direct3D.pas',
    Direct3D8 in 'win\Direct3D8.pas',
    DX7toDX8 in 'win\DX7toDX8.pas',
    Direct3D9 in 'win\Direct3D9.pas',
    DirectDraw in 'win\DirectDraw.pas',
    DirectShow9 in 'win\DirectShow9.pas',
    DirectInput in 'win\DirectInput.pas',
    DirectSound in 'win\DirectSound.pas',
    DirectPlay8 in 'win\DirectPlay8.pas',
    DirectMusic in 'win\DirectMusic.pas',
    WMF9 in 'win\WMF9.pas',
    ZLibConst in 'common\ZLibConst.pas',
    ZLib in 'common\ZLib.pas',
    Character in 'common\Character.pas',
    Generics.Defaults in 'common\Generics.Defaults.pas',
    Generics.Collections in 'common\Generics.Collections.pas',
    Rtti in 'common\Rtti.pas',
    TimeSpan in 'common\TimeSpan.pas',
    Diagnostics in 'common\Diagnostics.pas',
    AnsiStrings in 'common\AnsiStrings.pas',
    TpcShrd in 'win\TpcShrd.pas',
    RtsCom in 'win\RtsCom.pas',
    MsInkAut in 'win\MsInkAut.pas',
    MsInkAut15 in 'win\MsInkAut15.pas',
    Manipulations in 'win\Manipulations.pas',
    IOUtils in 'common\IOUtils.pas',
    D2D1 in 'win\D2D1.pas',
    DxgiFormat in 'win\DxgiFormat.pas',
    Wincodec in 'win\Wincodec.pas',
    KnownFolders in 'win\KnownFolders.pas',
    ObjectArray in 'win\ObjectArray.pas',
    PropSys in 'win\PropSys.pas',
    PropKey in 'win\PropKey.pas',
    StructuredQuery in 'win\StructuredQuery.pas',
    StructuredQueryCondition in 'win\StructuredQueryCondition.pas'; 
    

    【讨论】:

    • 好吧,我试过了,得到了同样的错误。我不认为 CC 上有一个地方可以提供运行时包的调试版本及其 DCP?
    • (或者甚至只是 rtl140 的调试 BPL 和 DCP。我可以很容易地重建其余部分,但我确实需要一些方法来在 System 和 Generics.Collections 中四处寻找。)
    • 可能有。我似乎记得 Chris Hesik 正在努力获得一个可以与已发布的 rtl 包一起使用的调试 .dcp。我知道,在下一个版本中,我们计划为所有运行时包提供调试 .dcps。
    • 甜蜜!我会很期待的。我想我必须在此期间向 Chris 询问 D2010 版本。
    • AFAICS 可以创建一个 rtl 包 + 包头进行调试,但由于交付时缺少 ComObjWrapper,因此该包不能与 IDE 或 vclie 包一起使用。只使用 Variants.dcu 而不是 Variants.pas 怎么样?如果 Chris 能够为 D2010 软件包提供调试 DCP,他会按照他在博客中的承诺这样做。
    【解决方案2】:

    程序或单元“变体”递归地使用自己

    通常是由于在您尝试构建的项目的库搜索路径中有指向 source/win32/rtl/sys 的路径。

    【讨论】:

      【解决方案3】:

      转到 (Delpi_Path)\source\Win32\rtl\sys,然后将“Variants.pas”重命名为任何内容,例如“Variants.sav”,然后一切正常。

      这是因为Delphi现在在任何地方都找不到“Variants.pas”,但它仍然可以在某处找到名为“Variants.dcu”的已编译dcu文件,就是这样。

      附:如果Delphi也找不到dcu,你应该手动搜索“Variants.dcu”,然后在“工具->选项”菜单中添加路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-02
        • 2019-06-28
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 2016-06-17
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多