如何在Delphi IDE中诊断“无法访问包信息”错误

时间:2009-07-11 05:20:03

标签: delphi ide packages custom-component

我正在开发一组基于TFrame的组件,这些组件彼此继承(就像许多帮助我非常的人已经知道了!),并且我正在遇到另一个小问题“阻碍,“与包装和安装有关。

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

TFrame
  TBaseFRame
TBaseSizeableFrame
  TViewerType1
  TViewerType2

...以及一个面板, TExtRzPanel ,它继承自Raize面板,并添加了一些尺寸/移动功能,以及一些其他属性/功能。 TBaseSizeableFrame 使用此组件,并将其大部分功能传递给框架本身,因此我可以直观地开发复合查看器组件。总体而言,它运作良好。

TFrame后代都注册到调色板中(参见 this post我前面提过的相关问题。目前,我的软件包设置如下:

  • MyPanels - 包含TExtRzPanel
  • BaseFrames - 包含TBaseFrame和TBaseSizeableFrame
  • ViewerSet1 - 包含一个基于查看器框架的组件,以及一个将该查看器作为对话框表单调用的非可视组件。 (我正计划在这个包中加入其他一些观众)。

引起我目前混乱的主要错误是:

无法访问包“MyPanels.bpl”

的包信息

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

基于this我删除了DCP文件(以及DCU文件,我想在某些时候),卸载软件包,然后重新编译/重新安装它们MyPanels - > BaseFrames,并让他们全部工作到那一点,但在安装ViewerSet1后,整个事情再次爆炸。 我在试图解决这个问题时指出的其他错误包括:

  • 程序包C:\ Documents and Settings \所有用户\ 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 pakckage中删除了对话框表单,它会安装好。如果我再次添加表单(没有显示其DFM,就像我遇到 here),它似乎安装好了。我已经安装了所有组件而且看起来工作正常(并在我的VM中快照整个事情!),但我仍然不确定出了什么问题,也没有原因。什么可以添加该表单最初做了哪些会导致这些错误?任何的想法?

我认为,即使是更好地解释/理解导致“无法访问包信息”错误的内容,从长远来看也会有所帮助。

1 个答案:

答案 0 :(得分:0)

好的,肯定有一些我不知道的东西。来自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创建)。

请问这个问题,但你是否通过选择File-&gt; New-&gt; 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。