【问题标题】:How to diagnose "Cannot access package information" error in Delphi IDE如何在 Delphi IDE 中诊断“无法访问包信息”错误
【发布时间】:2010-11-09 22:12:54
【问题描述】:

我正在开发一组基于 TFrame 的组件,它们相互继承(正如许多在此过程中大力帮助我的人已经知道的那样!),并且正在遇到另一个小“ snag”,与软件包和安装有关。

我基本上有以下层次结构:

TFrame
  TBaseFRame
TBaseSizeableFrame
  TViewerType1
  TViewerType2

...还有一个面板,TExtRzPanel,它继承自 Raize 面板,并为其添加了一些大小调整/移动功能,以及一些其他属性/功能。 TBaseSizeableFrame 使用这个组件,并将它的大部分功能传递给框架本身,因此我可以直观地开发复合 Viewer 组件。总体来说效果不错。

TFrame 后代都注册到调色板(请参阅 this post 我之前提出的相关问题)。目前,我有这样的包设置:

  • MyPanels - 包含 TExtRzPanel
  • BaseFrames - 包含 TBaseFrame 和 TBaseSizeableFrame
  • ViewerSet1 - 包含一个基于 Viewer 框架的组件,以及一个以对话框形式调用该 Viewer 的非可视组件。 (我计划在这个包中也有一些其他的观众)。

导致我目前混乱的主要错误是这个:

无法访问包“MyPanels.bpl”的包信息

我现在对这件事感到头晕目眩,以至于我无法记住我尝试过的确切顺序和顺序,但是当我将对话框表单添加到 ViewerSet1 时,问题似乎就开始了,使用来自同一项目的 TViewer 框架,因此(当然)使用 TExtRzPanel(这是 IDE 抱怨的包)。

基于this,我已经删除了 DCP 文件(我认为在某些时候也删除了 DCU 文件),卸载了软件包,然后重新编译/重新安装了它们 MyPanels -> BaseFrames,并让它们全部正常工作点,但是在安装 ViewerSet1 后,整个事情又一次崩溃了。 我在尝试解决此问题的过程中注意到的其他错误包括:

  • 无法安装包 C:\Documents and Settings\All Users\Documents\RAD Studio\5.0\Bpl\MyPanels.bpl,因为它是使用不同版本的 Delphi 或 CBuilder 创建的。 你想在下次加载项目时尝试加载这个包吗?(注意:我只用一个版本的 Delphi -- Delphi 2007 构建了这个包)
  • 在某一时刻,我注意到 MyPanels 的包描述没有“接受”(即它只显示为文件名是 Tools -> Compoenent -> Install Packages),这让我觉得 也许 IDE 正在查找/使用的文件有两个版本,但我没有看到/发现是这种情况。
  • Delphi启动时的警告,提示无法加载已安装的包,下次是否要加载等。
  • 无法访问包“MyPanels.bpl”的包信息(起泡、冲洗、重复)

任何和所有帮助/方向回复:如何诊断,以及任何可以帮助我理解甚至寻找什么的概念性解释,将不胜感激。提前致谢。你们在这里帮了大忙!谢谢你。 :)


稍后更新:

把这个放在一边再回来,我尝试删除所有 DCP / DCU MyPanels 文件,然后逐步安装这三个包。 (VMWare 在这里值得一提——每次成功后的快照,这样如果/当出现问题时,就不必从底部重新开始)。事实证明,如果我从 ViewerSet1 包中删除了对话框表单,它就安装好了。如果我然后再次添加表单(它没有显示它的 DFM,就像我遇到 here),它似乎可以安装。我没有安装所有组件,并且似乎工作正常(并在我的 VM 中对整个事物进行快照!),但我仍然不确定出了什么问题,也不知道为什么。最初添加该表单会导致这些类型的错误吗?任何想法?

我认为,从长远来看,更好地解释/理解哪些事情会导致“无法访问包信息”错误会有所帮助。

【问题讨论】:

    标签: delphi ide packages custom-component


    【解决方案1】:

    好的,我肯定缺少一些东西。来自 SysUtils:

    function PackageInfoTable(Module: HMODULE): PPackageInfoHeader;
    var
      ResInfo: HRSRC;
      Data: THandle;
    begin
      Result := nil;
      ResInfo := FindResource(Module, 'PACKAGEINFO', RT_RCDATA);
      if ResInfo <> 0 then
      begin
        Data := LoadResource(Module, ResInfo);
        if Data <> 0 then
        try
          Result := LockResource(Data);
          UnlockResource(Data);
        finally
          FreeResource(Data);
        end;
      end;
    end;
    

    因此,如果您收到最后一个错误,则说明您的包没有附加必要的 PACKAGEINFO 资源。这可能也是您的第一个错误的原因(使用不同版本的 Delphi 创建)。

    Appologies 提出这个问题,但是您是否通过选择 File->New->Package-Delphi 创建了包?我在问,因为它具有仅具有 bpl 扩展的库的所有特征。

    如果您确定该软件包是以正确的方式创建的,我建议您在整个硬盘驱动器中搜索同名的 DLL 文件。并且您找到的所有 bpl 包,您应该执行以下操作:

    C:\Program Files\CodeGear\RAD Studio\5.0\bin\tdump.exe mypackage.bpl>mypackage.txt
    

    在您的 mypackage.txt 文件中应该有一个名为 PACKAGEINFO 的资源。

    或者,您可以从 live.sysinternals.com 下载 filemon.exe,设置 bds 过滤器并监视 IDE 实际尝试加载的内容。它很可能是您的包正在加载的另一个包,并且第二个包没有附加 PACKAGEINFO。

    【讨论】:

    • 没有必要为问任何事情而道歉——感谢您在这里输入/想法,并将尝试它们。
    • 想知道您的“这是否具有仅具有 bpl 扩展的库的所有特征”可能与上述更新信息有关:添加对话框表单...?
    • 好的,如果删除对话框允许安装包,那么显然问题不在于包定义不正确。我仍然很想知道 TDUMP 向您展示了什么 - 在包的损坏版本和不包含对话框的工作版本上。如果这是某种 Delphi 问题,那么也许您可以尝试通过将对话框移动到它自己的单独运行时包中来解决它?
    • TDUMP(顺便说一句之前我没有使用过)似乎与我创建的其他(工作)BPL 基本相同。这是一个相当大的文本文件。我会特别寻找什么?
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多