Что касается уменьшения размера самой библиотеки CEF, потребуется полная перестройка и некоторая фаза отладки. Много времени потрачено, возможно, оно того не стоит - 40 МБ мало, с учетом сегодняшней мощности компьютера и пропускной способности сети. Я бы предпочел полагаться на «официальную» версию 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, но у вас не будет никакого возможного сжатия.
person
Arnaud Bouchez
schedule
22.11.2011