问题标签 [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.
delphi - 安装 Delphi 包因缺少 rtl170.bpl 而出现错误
目前我将一个项目从 Delphi XE 移动到 XE8。我们使用一个组件,但最新版本是针对 XE3 的,所以我获取代码并对其进行更改,直到它编译为止。现在我想安装设计时包,但我得到了缺少 rtl170.bpl 的错误。没有人提到 rtl170 只提到 rtl 库。我读了一些关于运行时包的东西,但在这个项目中,我在项目选项的包下没有这个菜单项。有什么建议吗?之前在这台计算机上安装了 Delphi XE,但我在安装 XE8 之前卸载了它。
delphi - 我可以使包中的 `requires` 子句有条件吗?
我正在使用 Anders Melander 的 DragDrop 包。
它在 Win32 模式下工作正常,但需要调整为 64 位。
我通过添加{$IFNDEF CPUX64}
注释掉对 designIDE 的引用来做到这一点。
但是,当我从
至
编译器简单地丢弃包源中的 DesignIDE 行,只留下:
这适用于 X64,但一旦我为 32 位重建,它就会中断。
有没有办法让一个包包含 win32 的设计时项目和 X64 的 IFDEF 冲突项目?还是我被迫为 X64 创建一个单独的运行时包?
c++builder - 在从 C++ Builder 2010 升级到 C++ Builder 10 Seattle 的项目中构建后无法安装 bpl
我有一个大型项目组,我正在从 C++ Builder 2010 更新到西雅图。如此跳跃:) 我遇到了几个问题并设法解决了所有问题,但昨天我有点挠头。一个项目构建了系统其他部分使用的 bpl。经过一些小的代码调整后,它可以正常编译,但是当我右键单击项目以“安装” bpl 时,我收到一条错误消息
过程入口点@TLanguageDialog@$bctr$qqrp25System@Classes@TComponent 在动态链接库 TranslationTools.bpl 中找不到
如果我没记错的话,TComponent 是 VCL 库的一部分,所以我试图弄清楚这里的问题是什么以及如何解决它。bpl 的构造方式是否发生了变化,所以它期待一些以前不存在的东西还是什么?如前所述,它编译得很好,但以防万一这里是包含和 lib 路径的设置。
包括:$(BDSINCLUDE)\windows\vcl;$(BDSINCLUDE)\windows\vcl\design
库:$(BDSLIB)\$(PLATFORM)\$(Config);$(BDSLIB)\$(PLATFORM)\Release\psdk
linker-errors - C++ builder包导出链接错误
我创建了一个 *.bpl 项目BPL_A,其中包含一个 TForm 子类,比如TForm_Sub。
头文件Form_Sub.h如下:
源文件Form_Sub.cpp如下所示:
我创建了另一个 *.bpl 项目BPL_B来动态创建 TForm_Sub 实例。
我将 BPL_A.bpi 添加到 BPL_B 的 Requires 部分。但是,在构建 BPL_B 时出现以下链接错误。
[ILINK32 错误] 错误:在模块 xxx.OBJ 中导出 SomeClass::CreateUI() 引用单元 BPL_A]Form_Sub 中的 __fastcall TForm_Sub::TForm_Sub()。
我无法弄清楚缺少什么。
package - 使用自定义搜索路径延迟加载包
我编写了一个BPL项目并将输出.bpi文件添加到另一个EXE项目。EXE项目编译和链接良好。如果我将.bpl文件与.exe文件放在同一文件夹中,则EXE运行良好。但是,如果我将.bpl文件放在.exe文件以外的其他文件夹中,则EXE无法运行,并显示“程序无法启动,因为缺少 XXX.bpl...”。
我还编写了一个DLL版本并将.dll文件放在.exe文件以外的其他文件夹中。我将.dll添加到EXE项目的“C++ 链接器”->“高级”->“延迟加载 DLL”列表,并将SetDllDirectory()
函数调用添加到我的自定义搜索路径。EXE运行良好。如果通过自定义搜索路径延迟加载, .bpl似乎无法与.dllSetDllDirectory()
一样工作,对吗?
测试 BPL 代码如下:
“ TestPackage.h ”
“ TestPackage.cpp ”
测试表应用代码如下:
“ TestApp.cpp ”
我在应用程序选项中禁用了“使用运行时包构建”和“动态 RTL ”。我将TestPackage.bpl作为EXE放在文件夹中,并且EXE运行良好。我可以将BPL与EXE分开升级,比如让TestPackage::GetInt()
返回其他数字。所以最终结果似乎我可以使用EXE部署我的自定义BPL,而其他BPL,如RTL和VCL,仍然在EXE中静态链接。唯一的限制是我的自定义BPL必须与EXE位于同一文件夹中,有什么办法可以克服吗?
bpl - 如何将“vcl.bpi”添加到 BPL 项目
我使用 C++ builder 2009 创建一个 BPL 项目。“ Requires ”列表默认具有“ rtl.bpi ”。我将一些 VCL 表单添加到“包含”列表并尝试构建 BPL 项目。由于链接器错误,例如“ Unresolved external 'Forms::TForm::' referenced from XXX.OBJ ”,构建失败。很明显,我应该将“ vcl.bpi ”添加到“ Requires ”列表中。我执行以下步骤:
- 右键单击“ Requires ”并选择“ Add Reference ”。
- 在“添加”对话框-->“需要”选项卡中,在“包名称”文本编辑中键入“vcl.bpi” ,然后单击“确定”。
- 它会弹出一个错误对话框,显示“未找到文件 vcl.bpi ”。
我应该如何手动添加“vcl.bpi”?
plugins - 如何仅部署 .EXE 和自定义 .BPL 文件?
我想用插件开发 GUI 应用程序。插件包含从 Plugin-Core 库中的 Base Forms 继承的 VCL Forms。主应用程序可以选择动态加载哪个插件,然后显示哪些 Form 子类。
在用户方面,我想部署 main .EXE、插件核心库和许多针对不同模型的插件库。我可以向用户发布新的或修改现有的插件库,以在不修改主.EXE和 Plugin-Core 库的情况下为新设备显示新表单。
我开发的第一个版本使用 DLL 方法,即 Plugin-Core 库和插件都是 DLL 形式。在用户方面一切都很好。但是,在开发人员方面,如果没有在 Plugin-Core DLL 项目中定义的 Base Forms,则无法链接插件 DLL 项目。这意味着Base Forms实际上是静态链接在每个插件DLL项目中的,如果有一天我修改了Base Forms并重新构建Plugin-Core DLL项目,我必须重新构建所有插件DLL项目并重新发布插件.DLL用户,也是。
在StackOverflow中搜索和询问后,我意识到VCL Forms不能跨DLL边界继承的限制是由于RTTI冲突(?)。建议的解决方案是将库从 DLL 修改为 BPL 形式,这是我开发的第二个版本。除了以下两个之外,一切都很好:
从插件 BPL 动态加载的表单与Windows 任务栏中的主.EXE是分开的。这不是我想要的。解决方案是我在.EXE项目中启用了“使用运行时包构建” 。
在.EXE项目中启用“使用运行时包构建”后,我必须向用户发布其他 .BPL,例如vcl.bpl和rtl.bpl。这不是我想要的。
我想知道以上两个问题可以同时解决吗?在我看来,如果我可以解决这两个问题:
- 在.EXE项目中禁用“使用运行时包构建” 。
- 在所有.BPL项目中启用“使用运行时包构建” 。
这样,.EXE可以在没有捆绑vcl.bpl和rtl.bpl的情况下运行,并且插件.BPL可以成功加载,因为依赖单元已经是主.EXE的一部分?我对么?但是,所有.BPL项目选项中都禁用了“使用运行时包构建”复选框。结果,我没有机会检查解决方案是否有效。对于冗长的描述,我很抱歉,由于公司的互联网安全政策,我无法附上图片。
delphi - 什么是“.~bpl”文件?
使用Code Gear Delphi 2007(不知道是否重要),每次编译“.bpl”包时,也会创建一个“.~bpl”文件。什么是“.~bpl”文件?这些文件是必需的还是有办法避免创建它们?
c++ - 是否可以将继承自 delphi BPL 的基类型的 C++ 类导出到 DLL
我想创建一个Gctable::TGcTable
继承自的类Pgaccess::TPgTable
并将其导出到.DLL
问:有可能吗?
我有这样的类定义:
当我使用 TDump 实用程序查看 .dll 中的导出成员时,我看到的是:
所以它导出Gctable::SqlSchemaHelper
了类而不是Gctable::TGcTable
我相信 TPgTable 是在一个pgdacvclXXX.bpl
delphi - 在 LoadLibrary 中动态加载 BPL 失败
我想在 Delphi 10 Seattle(更新 1)或 Delphi 10.1 Berlin 项目(企业版)中动态加载 BPL 模块。但是LoadPackage函数失败并显示消息(在 32 位和 64 位目标平台上):
项目 LoadPackageTest.exe 引发异常类 EPackageError,并带有消息“无法加载包“此处的真实路径”\TestBplPackage.bpl。指定的模块无法找到'。
我的开发平台是 Windows 10 Pro 64 位。
我确信传递的文件名是正确的(它包含完整路径)。到目前为止我所做的:
如果使用 Delphi 2007 Enterprise 编译 - 在同一台 Win 10 PC 上,相同的项目组可以正常工作(我不得不从头开始重新创建它)
如果我加载标准 .DLL - 它已正确加载,我可以调用 D2007、D10 和 D10.1 中的函数(适用于 D10 和 D10.1 上的 32 位和 64 位目标)。
实际上 LoadPackage 调用 SafeLoadLibrary,后者调用 LoadLibrary(所有这些过程都在 System.SysUtils 中。
我编译了带有和不带有运行时包的测试可执行文件有代码:
DLL 项目 (TestDLL.dpr),适用于所有情况
BPL 项目 (TestBplPackage.dpr)
测试应用程序 - LoadPackageTest.dpr
Form1:TForm 包含 dOpen:TOpenDialog 和一个 Button1:TButton
有没有人尝试过类似的东西?
避免从项目管理器树的“包含”节点中删除单元 - Delphi 10 和 10.1 都崩溃...
编辑 1:它适用于某些条件
感谢大卫的回答,我设法取得了一些进展:
当相关
C:\Program Files (x86)\Embarcadero\Studio\18.0\Redist\
Win32或Win64子文件夹的内容位于应用程序和测试 BPL 位于相关的System32或SysWOW64文件夹中。
如果没有上述内容,我无法使其工作,尽管
C:\Program Files (x86)\Embarcadero\Studio\18.0\bin和
C:\Program Files (x86)\Embarcadero\Studio\18.0\bin64
位于 %PATH% 环境变量中。它没有找到RTL包。
如果应用程序依赖 %PATH% 变量来查找必要的 BPL,则很容易解释副作用。因为我在 %PATH% 变量中有 C:\Windows\SysWOW64;C:\WINDOWS\system32;C:\WINDOWS
,如果我使用运行时包为 Win32 平台编译,我会收到以下错误消息:
应用程序无法正确启动 (0xc000007b)
这是因为 32 位应用程序尝试加载 64 位 BPL。
我可以轻松交换 System32 和 SysWOW64 的位置,但这是全局变量,而不是用户路径变量,需要重新启动才能使更改生效。
我将继续试验,但到目前为止,唯一 100% 可行的解决方案是将使用过的“标准”BPL 保存到平台输出文件夹中。