问题标签 [delphi-10.1-berlin]
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 - 在 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 保存到平台输出文件夹中。
delphi - Delphi 10.1 Berlin 中软件包的库文件夹
看来我不明白我应该如何在 Delphi 中配置库文件夹。
我创建了一个包,将它安装在 IDE 中,我可以将它放在一个表单中,然后项目编译。然后,我执行并得到一个异常,说我在包的一个单元中使用的类之一找不到。
这怎么可能?我可以看到包的 dcu 文件。
设置的文件夹是这样的:
在库路径中,我有 .pas 文件的文件夹(源)
.bpl 文件存在于 $(BDSCOMMONDIR)\Bpl 目录中
.dcu 文件存在,我已在调试 dcu 路径中添加了文件夹
它是一个可视组件(因为我可以将它放在一个表单中)并且豁免是由一个类(非可视)引起的
。确切的错误消息是:
项目提出 ClassNotFound 并带有消息 'class tTopBarontrol' not found"
更新:我已经完全删除了导致错误的类并删除了所有文件。然后重建组件并再次安装它,由于某些原因,我仍然得到具有相同类名的相同异常。
看起来有些东西卡在编译器和这个组件中。
ios - Delphi Berlin EObjectiveC 与消息'ObjectiveC 类 CTCallCenter 找不到
我正在使用 Delphi 10.1 Berlin
只需在 IOS 电话
Embarcadero\Studio\18.0\Samples\Object Pascal\Mobile Snippets\PhoneDialer上运行 PhoneDialer 示例
如果我在调试模式下运行,应用程序在启动时崩溃我收到此错误
调试器异常通知
Project PhoneDialer 引发异常类 EObjectiveC,并带有消息“找不到 ObjectiveC 类 CTCallCenter”。
看起来它发生在
FMX.PhoneDialer.iOS单元中
有没有人有什么建议?
如果您可以让示例工作,您是否可以包含实现它所需的代码:)
作为旁注 - 运行相同样本的 Delphi 10.0 Seattle 似乎工作正常
sql - Delphi 中的 SQLQuery 脚本查找特定日期
在运行语句之前如何在 Delphi 中准备查询?
我有一个来自 GUI 控件的值,用于过滤数据。
delphi - 如何从 TCustomEdit 替换已删除的受保护虚拟 DoTyping 方法?
我有一个自定义 FMX 组合框控件,我正在尝试从 Delphi XE6 移动到 Delphi 10.1 Berlin。该控件继承自 TComboEdit。在我的控制下,我覆盖了受保护的虚拟方法 - “DoTyping”,它曾经存在于 TCustomEdit 中,但在 Delphi 10.1 Berlin 中不再存在。如何在不重写整个控件的情况下保留我的代码?Delphi 10.1 Berlin 中是否有我正在监督的同义词?
看起来好像 TCustomEdit 添加了一个新属性
delphi - Delphi 10 Seattle 和 10.1 Berlin 无法调试 COM DLL
我有一个 COM DLL 项目,我可以在 Delphi 2007 和 XE8 中调试它(在断点处停止)。
但是,IDE 似乎不可能在 Delphi 10 Seattle 或 10.1 Berlin 的断点处停止。
我的调试步骤:
更改为 DEBUG(并检查是否勾选了那些调试选项。例如调试信息)
regsvr32 输出目录下的项目DLL
编写一个简单地创建 COM 对象并调用其方法的 vbscript
在调试器中,设置用于 32 位或64 位调试的
Run
命令行c:\windows\syswow64\cscript.exe
c:\windows\system32\cscript.exe
设置命令行参数以运行 vbscript。
在调用的方法处设置断点。
按 F9
预期:在断点处停止
在 Delphi 2007 和 XE8 中,一切都很好,但我无法在 Delphi 西雅图或柏林做到这一点。
这里可能出现什么问题?为了在 Delphi 的最新 IDE 版本下调试 COM DLL,我需要启用/禁用任何设置吗?
delphi - FireDac 冻结 GUI
我在 Delphi 10.1 Berlin 下使用 FireDac。
为了向用户显示数据,我使用 TDBEdit 等数据感知控件。
我使用 TFDQuery 和 TDataSource 将它们与控件链接起来。
这可行,但需要一些时间才能执行的长 sql 查询会冻结 GUI。
我想知道如何在执行那些长时间运行的查询时阻止 gui 冻结。
我在考虑后台线程。
在 wiki 上,我读到 FireDac 可以使用多线程: http://docwiki.embarcadero.com/RADStudio/XE6/en/Multithreading_(FireDAC)
然而,在 embarcadero 社区论坛线程Jeff Overcash 中写道:
我没有看到询问或 Dmitry 提到的一件事是,您不能针对后台线程查询使用 TDataSource 或 LiveBindings。如果您在后台处理显示结果的查询,您应该断开 LB 或 DataSource,打开并获取所有数据,然后重新建立连接。
这两个将尝试将光标移动到您身上或查询缓冲区以进行显示,而缓冲区非常不稳定,正在不同的线程中移动。
我想知道是否有人也使用 FireDac 并在表单上显示值可以帮助我。
delphi - 为什么全局原子表中存在与模块名相同的字符串时Firemonkey不创建应用程序句柄
情况:全局原子表中有一个字符串与我的应用程序相同。我的应用程序没有创建应用程序句柄,我得到一个无效的窗口句柄。
FMX.Platform.Win 中的代码
我有一个旧应用程序,其中 exe 具有相同的名称。关闭后,它会在 globalatomtable 'COM' 中留下一个字符串。关闭这个旧应用程序后。我无法再打开新应用程序,因为它一直在 gloabal atom 表中找到这个“COM”,导致应用程序句柄和窗口句柄无效。
如果我将代码放在注释中,则应用程序将以有效的应用程序句柄完美启动。
delphi - 如何在 Delphi 10.1 Berlin 中访问私有方法 TStreamReader.FillBuffer?
如何在 Delphi 10.1 Berlin 中访问私有方法 TStreamReader.FillBuffer,我们在 10.1 之前使用类助手完成了它 - 但建议的解决方案不起作用:
它失败只是因为 GetMethod 返回 NIL。任何想法为什么会失败?
编辑: 我确实想知道它为什么失败