Chromium Embedded Framework(http://code.google.com/p/delphichromiumembedded/)很不错。我用它来显示从Delphi代码生成的静态HTML,JS和CSS。
但我发现它太大了。
我需要:
- 我需要HTML支持
- 我需要JavaScript支持。
- 我需要CSS支持。
- 我需要Unicode支持。
- 我需要OnNavigate事件。
不需要:
- 我不需要D3D,GDI +,GLES支持。
- 我不需要加载网页的能力。 LoadString对我来说已经足够了。
- 我不需要Locales
- 我不需要缓存
- 我不需要开发人员工具
如何通过尽可能少的部署包来实现所需的功能?
目前CEF有40 MB的dll。
根据所需的功能,您可以省略一些文件/ DLL。我试过了,可以省略这些:
- avcodec中-53.dll
- avcodec中-54.dll
- avformat-53.dll
- avformat-54.dll
- avutil-51.dll
- ffmpegsumo.dll
- libEGL.dll
- libGLESv2.dll
- cef.pak
- chrome.pak
- devtools_resources.pak
我认为如果您简单地使用它来显示应用程序中嵌入的网站,您将失去视频播放功能和一些未显示的UI。
关于减少CEF库本身,它需要一个完整的重建,以及一些调试阶段。根据今天的计算机功率和网络带宽,花费了大量时间,可能不值得 - 40 MB很小。我宁愿依靠CEF的“官方”版本来关注最新版本的浏览器。
如果您的问题是关于部署包大小和单个可执行/无安装功能,您可以考虑嵌入 dll
在里面 exe
。
我使用的技巧是 .dll
文件在主文件中存储为zip .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,但你不会有任何可能的压缩。