14

Chromium Embedded Framework (http://code.google.com/p/delphichromiumembedded/) 很好。我用它来显示仅从 Delphi 代码生成的静态 HTML、JS 和 CSS。

但是我觉得太大了。

我需要:

  • 我需要 HTML 支持
  • 我需要 JavaScript 支持。
  • 我需要 CSS 支持。
  • 我需要 Unicode 支持。
  • 我需要 OnNavigate 事件。

不需要:

  • 我不需要 D3D、GDI+、GLES 支持。
  • 我不需要加载网页的能力。LoadString 对我来说已经足够了。
  • 我不需要语言环境
  • 我不需要缓存
  • 我不需要开发者工具

我如何通过拥有尽可能少的部署包来获得所需的功能?

目前 CEF 有 40 MB 的 dll。

4

2 回答 2

10

关于减少 CEF 库本身的大小,它需要完全重建,以及一些调试阶段。花了很多时间,也许不值得 - 根据今天的计算机能力和网络带宽,40 MB 很小。我宁愿依靠 CEF 的“官方”版本来关注浏览器的最新版本。

如果您的问题与部署包大小和单个可执行/无安装功能有关,您可以考虑将dlls 嵌入到exe.

我使用的技巧是将.dll文件以 zip 格式存储在 main.exe中,然后在硬盘驱动器上的私有临时文件夹中解压缩(您可能希望使用相同的文件夹,但C:\Program Files由于 Vista无法使用/Seven UAC,您的用户可能想知道所有这些文件的来源——这就是我使用私人文件夹的原因)。

从用户的角度来看,只有一个可执行文件可以运行。所有.dll文件都被压缩在其中,您还可以向文件中添加一些非二进制资源(这对于 exe/dll 压缩器是不可能的)。创建一个隐藏文件夹并用于加载库(必须使用 加载LoadLibrary(),而不是静态链接),并且只进行一次解压缩(因此它会比使用 exe/dll 压缩器更快)。

例如,我使用它来将 hunspell.dll 库和英语词典嵌入到我们的SynProject工具中。代码如下所示:

constructor THunSpell.Create(DictionaryName: string='');
var Temp, HunSpell, Aff, Dic: TFileName;
    i: integer;
begin
  if DictionaryName='' then
    DictionaryName := 'en_US';
  Temp := GetSynopseCommonAppDataPath;
  HunSpell := Temp+'hunspell.dll';
  with TZipRead.Create(HInstance,'Zip','ZIP') do
  try
    Aff := DictionaryName+'.aff';
    if not FileExists(Temp+Aff) then
      StringToFile(Temp+Aff,UnZip(NameToIndex(Aff)));
    Dic := DictionaryName+'.dic';
    if not FileExists(Temp+Dic) then
      StringToFile(Temp+Dic,UnZip(NameToIndex(Dic)));
    if not FileExists(HunSpell) then
      StringToFile(HunSpell,UnZip(NameToIndex('hunspell.dll')));
  finally
    Free;
  end;
  fHunLib := SafeLoadLibrary(HunSpell);
  if fHunLib=0 then
    exit;
  if not LoadEntryPoints then begin
    FreeLibrary(fHunLib);
    fHunLib := 0;
    exit;
  end;
  fDictionaryName := DictionaryName;
  fHunHandle := Hunspell_create(pointer(Temp+Aff),pointer(Temp+Dic));
  if fHunHandle=nil then
    exit;
   (....)
end;

有关详细信息和源代码,请参阅此链接。

您可能会考虑使用一些低级黑客,例如BTMemoryModule,但您不会有任何可能的压缩。

于 2011-11-22T06:55:01.593 回答
3

根据所需的功能,您可以省略一些文件/DLL。我试过并且可以省略这些:

  • avcodec-53.dll
  • avcodec-54.dll
  • avformat-53.dll
  • avformat-54.dll
  • avutil-51.dll
  • ffmpegsumo.dll
  • libEGL.dll
  • libGLESv2.dll
  • 头孢菌素
  • 铬.pak
  • devtools_resources.pak

我认为如果您简单地使用它来显示嵌入在您的应用程序中的网站,您将失去视频播放功能和一些未显示的 UI。

于 2014-03-19T10:48:54.300 回答