[Files]
Source: compiler:Dll Pack\xvidcore.dll; Flags: dontcopy
Source: compiler:Dll Pack\xvidvfw.dll; Flags: dontcopy
[Code]
//Created by South.Tver 08.2010
//модуль проверяющий наличие в системе пользователя видеокодека XVID и устанавливающий его в случае отсутствия
// !!! для записи в системный каталог и в реестр необходимы права администратора !!!
var
CanUseXvid, //флаг показывающий сможет ли в системе пользователя воспроизводиться видео,
// т.е. либо кодек уже был, либо его не было, но мы его успешно установили, т.е. кодеком можно пользоваться
//в своем скрипте, после вызова XvidInstall, нужно использовать флаг CanUseXvid
// т.к. вероятность того, что кодек в системе отсутвует и мы его тоже не смогли установить
// хоть и не большая, но все-таки существует
//например
//...
//if CanUseXvid then begin
// mciSendString('open myvideo.avi alias MyVideo parent '+IntToStr(WizardForm.Handle)+' style child','',0,0);
// mciSendString('put MyVideo window at 0 0 704 272','',0,0);
// mciSendString('play MyVideo repeat','',0,0);
//end;
//...
XvidInstalled : boolean; //локальная переменная для данного модуля, показывающая устанавливали мы кодек или нет. используется в XvidUnInstall
//XvidInstalled=False кодек в системе пользователя уже установлен или мы не смогли его установить,
// т.е. при закрытии инсталла делать ничего не нужно
//XvidInstalled=True кодека в системе не было, но мы его успешно установили,
// т.е. надо будет за собой прибраться при закрытии инсталла
procedure XvidDelete;
//тупо удаление кодека из системы
begin
DeleteFile(ExpandConstant('{sys}\xvidcore.dll'));
DeleteFile(ExpandConstant('{sys}\xvidvfw.dll'));
RegDeleteValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32','VIDC.XVID');
end;
procedure XvidInstall;
//для проверки установлен ли кодек и его установки, в случае отсутствии кодека в системе, вызвать XvidInstall.
//например
// procedure InitializeWizard;
// begin
// XvidInstall;
// end;
//или
// function InitializeSetup:boolean;
// begin
// XvidInstall;
// end;
var
f:boolean;
begin
CanUseXvid:=False; //пока кодеком нельзя пользоваться
XvidInstalled:=False; //мы еще не устанавливали кодек
//если кодек отсутствует или не корректно установлен
if not (FileExists(ExpandConstant('{sys}\xvidcore.dll')) and
FileExists(ExpandConstant('{sys}\xvidvfw.dll')) and
RegValueExists(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32','VIDC.XVID')) then
//попытемся установить кодек
try
XvidDelete; //на всякий случай чистим систему от остатков кодека, если была не удачная установка
ExtractTemporaryFile('xvidcore.dll');
ExtractTemporaryFile('xvidvfw.dll');
//устанавливаем кодек - кладем dll'ки в %SystemRoot%\system32\ (из другого места работать не будет) и пишем необходимый ключик в реестр
f:=FileCopy(ExpandConstant('{tmp}\xvidcore.dll'),ExpandConstant('{sys}\xvidcore.dll'),False);
f:=f and FileCopy(ExpandConstant('{tmp}\xvidvfw.dll'),ExpandConstant('{sys}\xvidvfw.dll'),False);
f:=f and RegWriteStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32','VIDC.XVID','xvidvfw.dll');
if f then begin //если установка прошла успешно
XvidInstalled:=True; //кодек мы поставили сами и его нужно будет потом удалить
CanUseXvid:=True; //кодек можно использовать
end else XvidDelete; //не удачная попытка установки кодека, чистим за собой на всякий случай
except
end
else CanUseXvid:=True; //кодек уже существует в системе, можно пользоваться
end;
procedure XvidUnInstall;
//при завершении приложения обязательно вызвать XvidUnInstall,
// если мы установили кодек в систему пользователя, то мусор в системе после себя оставлять очень плохо.
//например
// procedure DeinitializeSetup;
// begin
// XvidUnInstall;
// end;
//к тому же XvidInstall производит не полноценную установку кодека и в реестр вносятся не все записи.
// т.е. видео сможет воспроизводится, но конвертировать видео файл из какого-нибудь формата в xvid при такой устновке не получится
begin
//если XvidInstall устновил кодек, то удаляем его
//если кодек уже был в системе или отсутствовал, а мы не смогли его установить, то ничего не делаем
if XvidInstalled then XvidDelete;
end;