安装 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 DLL Project在自定义BPL中找不到单元,除非“Link with Runtime Packages”为True