安装 BPL 以及在其他 BPL 中实现的组件

Posted

技术标签:

【中文标题】安装 BPL 以及在其他 BPL 中实现的组件【英文标题】:Install BPL with components implemented in an other BPL in 【发布时间】:2016-05-22 13:27:23 【问题描述】:

我正在使用 C++ Builder 10 Seattle,我正在尝试安装一个组件包,该组件包注册在不同 bpl 中实现的组件。

技术上我已经这样做了:

我创建了两个包。一个定义为仅运行时 (comps.bpl),另一个定义为设计时 (compsIDE.bpl)。我自己实现的所有组件都包含在运行时库中。在设计时的包中,我包含了 fcomps.bpi 并添加了一个名为 compsreg.cpp 的单元。在单元中,我使用以下代码从 comps.lib 安装组件:

#include "MyComponent.h"

namespace comps

    void __fastcall PACKAGE Register()
    
        TComponentClass classes[1] = __classid(TMyComponent);
        RegisterComponents("MyComponents", classes, 0);
    

问题是组件没有安装。我对 Delphi 单元使用相同的技术,这些单元也包含在 comps.bpl 中并且它们已安装。

有人知道为什么 Register 方法不注册组件吗?我认为唯一的原因可能是该方法永远不会被 C++ 调用,而是为 Delphi...

希望得到您的帮助... 凯雷姆

【问题讨论】:

我不经常使用 C++Builder,但是注册函数不应该在命名空间内还是命名空间必须有不同的名称?为了简单的调试,在函数中添加一个 ShowMessage() 来表明它被调用。 是的,命名空间在我看来是错误的 请原谅我的天真,但是 BPL 是什么意思? @ThomasMatthews,Borland 的专有共享对象格式,一个“包”。 @ThomasMatthews:BPL 只是一个带有内置 VCL 支持的 DLL。 【参考方案1】:

添加一个名为 compsreg.cpp 的单元

这是问题的根源。文件中的namespace 必须与文件名匹配,否则IDE 将无法正确找到导出的Register() 函数。您需要将namespace comps 改为namespace compsreg

【讨论】:

非常感谢!我知道 IDE 在创建新组件时会使用正确的命名空间创建这部分代码。但我想知道这是否记录在任何地方? 大量文档,但都是针对 Delphi 的,在 C++ 中没有提及此命名空间限制,可能在第三方组件编写器参考中除外。您只需要记住 Delphi 单元名称会被转换为 C++ 命名空间。 我不知道这个。再次感谢您。

以上是关于安装 BPL 以及在其他 BPL 中实现的组件的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE6 在安装 bpl 时崩溃

构建后 bpl 文件中的异常

为不同的Delphi版本编译Delphi组件包(bpl)

如何在 Delphi XE5 上安装 Cindy 组件?

如何在 FMX 组件中加载资源

Delphi DLL Project在自定义BPL中找不到单元,除非“Link with Runtime Packages”为True