0

我对 Delphi 比较陌生,在实习岗位上。几周前,我被要求创建一个概念证明,以使用从 DLL 调用的非常基本的 Web 浏览器,然后浏览器将导航到特定的网站。我的概念证明需要根据主应用程序的要求实现一个 DLL。我被要求研究的组件是 TWebBrowser、DCEF3CEF4Delphi

在过去的几周里,我注意到每个组件存在不同的问题,我将简要讨论这些问题并尝试给出一个概述。

TWebBrowser:我知道 TWebBrowser 本质上是 Internet Explorer,特别是驻留在机器上的 IE 版本。而且我了解在注册表中设置文档模式,因为它默认为 IE7 模式,除非设置。我注意到,即使将文档模式设置为最高,该组件也会出现一些 JavaScript 和渲染问题。网站的特定部分需要与之交互,显示可选择的图像。当我在任何 IE11 中访问此站点时,它交互正常,但通过 TWebBrowser 组件显示图像但无法选择。我找不到遇到同样问题的人,所以我离开了 TWebBrowser。

DCEF3:这是非常有希望的。我能够制作一个与网站完美交互的独立浏览器。在我尝试将其移入 DLL 之前,没有任何问题。一切顺利,直到网络浏览器表单被释放;应用程序挂起并变得无响应。我可以让它不挂起的唯一方法是删除 FreeLibrary() 方法。问题是我有一个孤立的进程,在呼叫应用程序最终关闭后仍在运行。Windows 10 可以很好且积极地处理这个问题,但我使用的是 Windows 7 64 位操作系统(为 32 位编程)。我在网上看到其他有完全相同问题的人直接询问了组件开发人员,他的最终回答是它永远不会工作,然后就这样了。

CEF4Delphi:这是最有前途的!我能够将其放入 DLL 并从另一个应用程序打开浏览器。一切正常。我对此的唯一问题是它需要更改程序文件(.dpr),这在如此小的 POC 中很好,但在最终将与之一起使用的主程序中是不可接受的(程序文件在问题已经有近 2000 行)。

以下是 CEF4Delphi From 所需的更改:

    program Project1;

    uses
      Vcl.Forms,
      Unit1 in 'Unit1.pas' {Form1};

    {$R *.res}

    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

至:

    program Project1;

    uses
      Vcl.Forms,
      uCEFApplication,
      Unit1 in 'Unit1.pas' {Form1};

    {$R *.res}

    {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

    begin
      GlobalCEFApp := TCefApplication.Create;

      if GlobalCEFApp.StartMainProcess then
        begin
          Application.Initialize;
          Application.MainFormOnTaskbar := True;
          Application.CreateForm(TForm1, Form1);
          Application.Run;
        end;

      GlobalCEFApp.Free;
     end.

调用应用程序是在 Delphi 2006 中完成的,我尝试使用 Delphi 2006 和 Delphi 10.2 作为 DLL。因此,除了 CEF4Delphi 之外,我至少有两个版本的每个 DLL 都没有成功,因为上级永远不会同意对 .dpr 文件的更改。

我昨天偶然发现了一个非常相似的问题。我对 David Heffernan 的回答很感兴趣,特别是他关于修改组件的初始化和完成部分的结论。

所以我有两个关于 DCEF3 的问题:

是否可以编辑组件代码的这些部分以强制使其适合作为 DLL 工作?

如果是这样,我会怎么做?我明白显而易见的事情是“让它看起来”类似于大卫赫弗南在回答另一个问题时建议的代码,但就像我说的,我对 Delphi 比较陌生,所以真的不知道这个特别代码将在这种情况下进行。

或者,如果其他人对其他两个组件有任何建议,我会全力以赴。提前致谢。

4

0 回答 0