问题标签 [bpl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2594 浏览

c++ - 如何将 Borland 6 C++ 项目从包含 indy.bpi 更新为 indy60.bpi?

我在 C++ 中使用 Borland Builder 6 进行开发。当我点击“组件”/“安装程序 des paquets”时,我看到了 Package dclIndy60.bpi:“Internet Direct (Indy) for D6 Property and Component Editors”,这对我来说意味着一切正常,我可以随意使用Indy60 包(在 Indy9 文件夹中:indy 的版本 9,日期为 2002 年 11 月)并且不再使用旧的“indy”包(我的 BCB6 安装光盘上的默认版本)。

我的问题是我尝试编译一个“old_project”,显然是使用旧的 Indy.bpi 包(而不是我的 Indy60)编码的,并且在编译过程中它会弹出一个窗口说:“不可能找到'paquet d'importation' : indy.bpi",带有浏览按钮;然后我浏览到我拥有的唯一“indy”bpi 文件:Indy60.bpi。

事实上,我已经成功重新安装了 indy9(似乎),首先注意删除旧 indy 的所有痕迹(如论坛上所建议的那样)和希望的 indy 9,然后再次安装 indy 9(使用 BCB 6 光盘删除旧的 indy )。在我的“old_project”中,我确保(如上所述)它指向“组件”菜单中的 indy60。但在编译时,它仍然要求“indy.bpi”。

=> 如何删除对旧 indy.bpi 的任何引用和/或将其替换为新的 "indy60.bpi" ?

=> 还是我误解了 indy.bpi 和 indy60.bpi 之间的区别?还是我对 Borland Builder 的 bpi 和 bpl 管理造成了太大的混乱?

=> 或者我最好创建一个新项目并从旧的 BCB C++ 项目中逐个文件地复制它?

很抱歉我可能会造成混淆,我对从头开始开发 C++ 应用程序(在维护已经编写的应用程序方面有 3 年的经验)有点陌生,对 Borland Builder 也是新手。

最好的问候,阿诺。

0 投票
1 回答
337 浏览

delphi - 外部模块安全

我正在为应用程序开发一些外部模块。

这些模块是 BPL 文件,如果存在于应用程序文件夹中,应用程序将加载它们并使用其中可用的任何内容。

如何防止我的客户共享这些模块?

我需要他们被授权使用模块(一个模块一个模块)。

要获得某种许可证,注册模块,最好的方法是什么?

谢谢

0 投票
2 回答
3436 浏览

delphi - 动态加载 BPL 的共享代码/传递对象

我正在玩弄使用动态加载 BPL 并将对象实例从主应用程序传递到 BPL 中的方法的想法。这在应用程序和 BPL 使用的单元之间造成了问题。

我写了一个小的原型来做到这一点,并且很好奇 Delphi 如何在内部管理应用程序中定义的类与 BPL 之间的差异。

例如,说一个基本的 Widget 类,如:

现在应用程序和 BPL 是使用包含 TmyWidget 类的单元构建的。后来,TMyWidget 发生了一些变化,应用程序被重建,但 BPL 没有(反之亦然)。我添加了另一个方法 DoSomething2() 并在应用程序中创建了一个 TmyWidget 实例并将其传递给 BPL 进行处理并输入基本的例子,它奏效了。但它显然充满了潜在的问题。

如果另一个动态加载的 BPL 也使用 TmyWidget,那么事情会变得更加有趣。它似乎有效,但绝对感觉不理想。

主要问题是 - 通常如何在主应用程序和 DLL 或 BPL 之间传递对象?我以前从未尝试过,可能是有充分理由的,但我有这个想法适合这种方法......

我想最好的方法是序列化对象并将这些字节传递过来并在 DLL/BPL 中反序列化它,这个过程要注意主机和动态加载的模块之间的潜在版本差异,但我希望新的 SimpleSharedMem选项可能会在没有序列化开销的情况下带来这个新功能,但它似乎不是很有用,除非你严格保持应用程序和 dll 在任何共享代码更改上重建......但在这个原型中,应用程序将保持相当稳定并且动态加载的模块会随着添加到 TmyWidget 的功能而频繁更改。(服务器应用程序充当基于客户端请求构建 TmyWidget 的工厂,应用程序会将实例传递给各种模块进行处理。)

0 投票
1 回答
1442 浏览

delphi - 如何从 BPL 中提取资源?

如果我在 EXE 中有一个资源并且我想提取它,这很简单。就像是:

这是因为全局变量 HInstance 是 EXE 的句柄。BPL 中的代码是否有任何类似的方法来获取它所属的包的句柄,以便我可以从中提取资源?

0 投票
4 回答
3947 浏览

delphi - 如何正确地将 Delphi 项目划分为 BPL?

我工作的公司用Delphi开发了一个系统,里面有几十个exe模块,每个exe模块在源代码上都有一定程度的相同。可悲的是,从来没有人关心使用库来放入共享代码。这意味着每次在所有这些模块共享的代码中需要修复错误时,程序员都必须单独对它们进行更正!总是要花很多时间...

我决定找到一种方法将共享代码放入库中。我考虑过 DLL 和 BPL。在这种情况下,BPL 似乎对程序员更友好,麻烦也更少,尤其是代码仅在我们的软件中使用,并且仅在 Delphi 中使用。

我将所有 exe 模块共享的所有代码放入 BPL 中,一切似乎都很好,但是有些事情我不明白,如果您向我解释,我将不胜感激。

  1. 在将代码划分为 BPL 之后,我所期望的是,使用我创建的 BPL 部署 exe 文件就足够了。但事实证明,他们也需要 rtl100.bpl 和 vcl100.bpl。为什么会这样?我只想部署 exe 和我的 BPL。我不想为最终用户提供由 Borland 和第三方公司提供的一大堆库:)。我希望它们像以前编译的那样在 exe 中编译。有可能这样做吗?

  2. 到目前为止我所做的是:

    • 我将所有共享的 pas 单元放到 BPL 中。每个 BPL 都包含属于同一类别的单元,因此程序员很清楚在给定的 BPL 中期望什么代码。
    • 每个 BPL 都是一个“运行时和设计时”库。
    • 每个 BPL 都是“显式重建”的。后两者是 BPL 的默认项目设置。
  3. 如果涉及到 exe 项目:

    • 我删除了之前放入 BPL 的所有单元。
    • 我从 BDS 2006 中的 Tools->Install package 菜单安装了我的 BPL。
    • 在我的 exe 项目设置中,我选中了“使用运行时包构建”选项,并在下面的编辑框中列出了我所有的 BPL 包(只有我的包,因为我清除了那里出现的所有其他包)。

这就是我所做的一切。exe 项目可以正确编译,但我无法访问 BPL 的源代码(我无法从我的 exe 项目中导航到该代码),即使所有 BPL 都与其源代码文件一起存储。为什么?我觉得很奇怪。

我总是倾向于写冗长的描述 - 对不起:)。我会感谢你的帮助。我只需要对我提到的几点进行几句解释:仅使用我的 BPL 部署 exe,我所做的整体工作的正确性,以及无法导航到 BPL 源代码。非常感谢您!


谢谢大家的讨论。有人说我选择的方法不是一个好主意。我们的软件由 100 多个模块组成(其中大部分是不同设备的驱动程序)。它们中的大多数共享相同的代码 - 在大多数情况下是类。问题是这些类并不总是放在单独的、独立的 pas 单元中。我的意思是共享代码通常被放入包含特定于模块的代码的单元中。这意味着当您修复共享类中的错误时,仅将其定义的 pas 单元复制到所有软件模块中并重新编译它们是不够的。不幸的是,您必须将固定的代码片段一个接一个地复制并粘贴到适当的单元和类中。这需要很多时间,这就是我想消除的,选择正确的方法 - 请帮助我。

我认为使用 BPL 将是一个很好的解决方案,但正如你们中的一些人所提到的,它有一些缺点。最糟糕的问题是,如果每个 EXE 需要多个 BPL,我们的技术支持人员必须知道哪个 EXE 需要哪些 BPL,然后为最终用户提供适当的文件。只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一笔大买卖。他们肯定会迷路和生气:-/。

还可能发生兼容性问题 - 如果一个 BPL 由多个 EXE 共享,则对一个 BPL 的修改可能对一个 EXE 有利而对其他一些 EXE 不利 - @Warren P.

那么我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一。如果您有更好的想法,请告诉我。

  • 将共享代码放入单独和独立的 pas 单元中,因此当其中一个有错误修复时,将其复制到所有项目(覆盖旧文件)并重新编译所有项目就足够了。

就后面修改的代码而言,这个解决方案似乎没问题。但是我们也有具有通用功能和程序的 pas 单元,这些单元通常不需要修改——我们会在必要时添加新功能,但在单个项目中。所以想象一下,你在 100 个模块中的一个模块中编写了一个新函数,并将其放入它的通用单元中。一两个月后,您修改了一个不同的模块,并且您认为您需要两个月前编写的相同功能。您必须找到该模块(如果您不记得它是哪个模块,这很困难)并将该函数复制到您的代码中。并且很明显 - 只要将它们分别存储在每个项目中,每个模块中的通用单位就会变得完全不同。然后,如果有一个错误修复要做......整个故事重复。

  • 为所有共享代码创建 BPL,但将它们链接到 EXE,以便 EXE 是独立的。

对我来说,这似乎是现在最好的解决方案,但有几个缺点。如果我在 BPL 中修复错误,每个程序员都必须更新他们计算机上的 BPL。如果他们忘记了怎么办?但是,我仍然认为这是一个小问题。如果我们注意互相通知变化,一切都应该没问题。

  • @CodeInChaos:我不知道我是否理解正确。你的意思是在项目之间共享pas文件吗?怎么做?我们将源代码存储在 SVN 中。这意味着我们必须将共享代码存储在一个单独的文件夹中,并让所有项目都在那里搜索该代码,对吧?并从 SVN 下载一个项目及其依赖的所有文件夹......

请帮我选择一个好的解决方案。我只是不希望公司仅仅因为软件开发的愚蠢方法而在错误修复上浪费更多的时间和金钱。

非常感谢。

0 投票
2 回答
2596 浏览

delphi - Delphi中模块化编程的最佳方法

这是我从这里开始的讨论的延续。我想找到模块化 Delphi 源代码的最佳方法,因为我在这个领域没有经验。我将不胜感激您的所有建议。

让我把我已经写在那里的东西贴出来。

我工作的公司开发的软件由 100 多个模块组成(其中大部分是不同设备的驱动程序)。它们中的大多数共享相同的代码 - 在大多数情况下是类。问题是这些类并不总是放在单独的、独立的 PAS 单元中。我的意思是共享代码通常被放入包含特定于模块的代码的单元中。这意味着当您修复共享类中的错误时,仅将其定义的 PAS 单元复制到所有软件模块中并重新编译它们是不够的。不幸的是,您必须将固定的代码片段一个接一个地复制并粘贴到适当的单元和类中。这需要很多时间,这就是我想在不久的将来通过选择正确的方法来消除的问题 - 请帮助我。

我认为使用与 EXE 一起分发的 BPL 将是一个很好的解决方案,但它有一些缺点,正如前面讨论中提到的那样。最糟糕的问题是,如果每个 EXE 需要多个 BPL,我们的技术支持人员必须知道哪个 EXE 需要哪些 BPL,然后为最终用户提供适当的文件。只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一笔大买卖。他们肯定会迷路和生气:-/。

还可能出现兼容性问题 - 如果一个 BPL 由多个 EXE 共享,则对该 BPL 的修改可能对一个 EXE 有利而对其他一些 EXE 不利。

那么我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一。如果您有更好的想法,请告诉我。

  • 将共享代码放入单独和独立的 PAS 单元中,因此当其中一个有错误修复时,将其复制到所有项目(覆盖旧文件)并重新编译所有项目就足够了。这意味着每个单元的复制次数与使用它的项目数量一样多。

就很少修改的代码而言,此解决方案似乎没问题。但我们也有具有通用功能和程序的 PA 单元,这些单元经常进行修改。每次有人向此文件添加新功能时,都无法执行相同的过程(复制和重新编译这么多项目)。

  • 为所有共享代码创建 BPL,但将它们链接到 EXE,以便 EXE 是独立的。

对我来说,这似乎是现在最好的解决方案,但也有一些缺点。如果我在 BPL 中修复错误,每个程序员都必须在他们的计算机上更新 BPL。如果他们忘记这样做怎么办?但是,我认为这是一个小问题。如果我们注意互相通知变化,一切都应该没问题。你怎么看?

  • 最后一个想法,由 CodeInChaos 提出(我不知道我是否理解正确)。在项目之间共享 PAS 文件。这可能意味着我们必须将共享代码存储在一个单独的文件夹中,并让所有项目都在那里搜索该代码,对吧?我猜,每当需要修改项目时,都必须从 SVN 连同共享文件夹一起下载。共享代码中的每次更改都必须导致重新编译使用该代码的每个项目。

请帮我选择一个好的解决方案。我只是不希望公司因为一种愚蠢的软件开发方法而在错误修复上浪费更多的时间和金钱。到目前为止,没有人关心它,您可以想象它会导致多少问题。

非常感谢你。

0 投票
2 回答
1199 浏览

delphi - 外部模块实现

为 DELPHI 应用程序实现外部模块系统的最佳方式是什么?

我需要的是非常基本的:

  • 主APP检测模块是否存在并加载它(运行时)
  • 模块可以存储表单
  • 模块可以存储 DataModules
  • 模块可以存储代码

我需要在其他表格中使用商店表格,并且仅作为独立表格

我用这样的东西

所以我创建了一个 TForm,但是把它放在一个 TPanel 里面。

至于DataModules,我通常存储ImageLists,所以想法是改变应用程序ICO,只是稍微改变外部模块。

那么实现这一目标的最佳方法是什么?

查看了运行时 BPL,但似乎不明白如何去做。谢谢。

更新 : .....................................

在阅读了一些相关的问题和答案后,我想我找到了答案和解决方案。

http://edn.embarcadero.com/article/27178

这篇文章是旧的东西,但非常简单。

那么逻辑就在那里,我似乎没有得到它来显示表格</p>

我只是在测试示例 2

它加载 BPL,但没有得到表单:

总是检索 x 'nil'</p>

但是注册时的 BPL:

任何人都可以帮助解决这个问题。

0 投票
1 回答
878 浏览

c++ - 无法动态链接到自定义 bpl 中的组件

在起草以下帖子时,我找到了一个解决方案,但我认为仍然值得在这里发布以供参考。请参阅下面的解决方案。


在 RAD 工作室 (C++) 中,我有一个项目组,其中包含多个依赖于一组标准自定义控件的 dll 和 exe。我已将这些控件隔离在一个 borland 包 (bpl) 中,以便我可以在设计视图中使用它们。

现在,每当我将一个自定义控件从组件面板拖到表单时,似乎该组件实际上是静态链接到包含该表单的项目中。这不是我想要的,它会导致问题,因为我的一些控件依赖于链接到 bpl 的附加资源。

我已经删除了 RAD Studio 自动添加的#pragma 链接行,但该组件仍链接到可执行文件中。我看不出这是怎么发生的。

有任何想法吗?


好的,解决方案相当简单:在项目选项中,转到“包”页面,在“使用运行时包构建”下,输入包含公共组件的包的名称(不带 bpl 扩展名)。完毕。

0 投票
2 回答
3718 浏览

delphi - 打开项目时如何解决 Delphi XE 中的 bpl 加载问题?

很多时候,当我尝试在 Delphi XE 中打开任何项目时,一些流行的 bpl 包会出现以下问题:

无法加载包“Name1.bpl”。组件“Name2”不能被包“name1.bpl”注册,因为它已经被包“name1.bpl”注册了。您想在下次加载项目时尝试加载此包吗?

在此处输入图像描述

非常感谢您的帮助!

PS Kill 进程和 IDE 的双重重启总是有帮助的。

0 投票
1 回答
5842 浏览

delphi - Delphi XE2 无法使 BPL 插件工作

我试图用 XE2 实现一个简单的模块系统,但无法让它工作。当我尝试在 IDE 下运行它时,我可以从中获取句柄,LoadPackage()但无法获取该类GetClass()(即使它在 BPL 的初始化部分中是 RegisterClass()ed)。当我尝试在 Windows 下运行它时,我收到“此应用程序无法启动,因为未找到 rtl160.bpl”错误,甚至无法加载包。

模块代码

此外,初始化部分没有被执行,因为我没有看到“已注册”消息框。

主机应用程序是这样的;

主机应用程序与运行时包链接 True。模块没有运行时包选项。

另一个问题。我在网上看到了这个基本示例,但我计划添加更多类似的模块,如果我在初始化时尝试RegisterClass()第二个模块的 TfrModule 类会发生什么?如果我需要为每个模块指定不同的名称,那么无论如何模块都没有意义。我的意思是,如果主机必须确切知道模块的类是什么样的。