【问题标题】:Determining Delphi Runtime Packages to Include确定要包含的 Delphi 运行时包
【发布时间】:2010-12-06 11:07:53
【问题描述】:

我有一个 Delphi DLL,其中包含一个使用各种第三方组件的表单。这个 DLL 被许多不同版本的 Delphi 使用。我将第三方组件编译到 DLL 中。我相信我仍然需要链接到一些“基本”Delphi 包,如 rtl、vcl 等,因此我的 DLL 将使用 Delphi IDE 正在使用的相同内存管理器和其他全局资源。如何找出我需要链接到哪些 BPL?

理想情况下,如果我只使用 BPL 并且没有可用的源文件,我希望将一些实用程序指向我的 DLL 或项目,并让它列出它所依赖的每个 BPL。然后我可以查看该列表并选择我想在运行时加载的包。在“运行时包”下的项目属性中给出的当前列表是不完整的(因为它多年来一直在调整)。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    检查我写的一个名为“必需”的工具 - 你可以从http://www.drbob42.com/tools下载

    【讨论】:

    • 谢谢鲍勃。我通过“Project -> Information for ”菜单从 IDE 获得了我需要的信息,但我尝试了您的实用程序,它也有效。 :)
    • 拒绝访问路径 '\\etnaedndb02.embarcadero.com\f\webcache\cc\2002\7\31\18561.zip'
    【解决方案2】:

    选中“使用运行时包构建”,将整个包列表保持原样。

    做一个项目|构建(不是编译!)。构建完成后,使用 Project|View Information on ;结果对话框将为您提供您需要分发的实际软件包的列表。

    在 Jeremy 关于启用使用包进行构建时默认包列表为空的评论之后,以下是 Delphi 2010 的选项对话框中的列表:

       vclx;vcl;vclimg;dbrtl;Rave77VCL;bdertl;rtl;vclactnband;xmlrtl;
       vcldb;vcldbx;vcltouch;dsnap;dsnapcon;TeeUI;TeeDB;Tee;vclib;
       ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;
       intrawebdb_100_140;Intraweb_100_140;VclSmp;vclie;inetdb;
       webdsnap;websnap;inetdbbde;inetdbxpress;soaprtl;vclribbon;
       DbxCommonDriver;DbxClientDriver;DBXInterBaseDriver;DBXMySQLDriver;
       dbexpress;dbxcds;SynEdit_R2009
    

    【讨论】:

    • 这显示了静态链接的包,但是如果您在运行时加载一个,则无法使用任何静态分析工具获取此信息
    • 您好,肯,感谢您的回复。我使用的是 Delphi 2010。没有项目|查看信息菜单项,只有 OK 按钮关闭构建对话框。另请注意我的评论,即当前运行时包列表不完整(现在列表中只有 vcl)。
    • @Jeremy:是的,有。它位于项目菜单中,并在构建后启用。然而,他们似乎已将菜单文本稍微更改为该菜单上的“ 的信息”。澄清一下,它不是在构建对话框中;关闭构建对话框后,它位于 IDE 的主项目菜单中。
    • @Robert:你是对的,但这不是最初的问题。 :-)
    • 谢谢 Ken,它现在可以工作了,谢谢!我假设使用这种架构,我需要将 ShareMem 作为我的 DLL 中引用的第一个单元,这听起来正确吗?我在我的 Delphi 设计时包和这个 DLL 之间传递字符串引用。
    【解决方案3】:

    您可以评估Dependency Walker(取决于)或PE Information(下图)等工具,包括在GExperts

    【讨论】:

      【解决方案4】:

      “这个 DLL 被许多不同版本的 Delphi 使用。”

      您的意思是您有使用 Delphi 7 编写的程序和使用 Delphi 2007 等编写的其他程序使用相同的预编译 DLL?

      在这种情况下,您不能使用任何包在程序和 DLL 之间共享对象类型和内存,因为它们将使用不兼容的不同版本的包。

      【讨论】:

      • DLL 包含不同版本的 Delphi 使用的属性编辑器。我的 Delphi 设计时包调用到 DLL。我不在设计时包和 DLL 之间传递对象类型,只传递字符串、整数等“基本”类型。我相信因为我传递的是字符串,所以我需要使用 ShareMem。
      • 如果您要传递字符串,那么是的,您需要使用 ShareMem。然后是IDE是否也使用ShareMem的问题。如果没有,那么你不能传递字符串。改为传递 PAnsiChar 或 PWideChar。
      猜你喜欢
      • 2010-09-15
      • 2011-10-17
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多