Цитата vk_k14m@vk:
Как ты узнаешь установлен у тебя на компе например Microsoft Visual C++ 2015 года »
|
Код:

[code]
const
INSTALLSTATE_DEFAULT = 5;
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function MsiQueryProductState(szProduct: String): Integer;
external 'MsiQueryProductState{#A}@msi.dll stdcall';
function IsMsiProductInstall(ProductCode: String): Boolean;
begin
Result := MsiQueryProductState(ProductCode) = INSTALLSTATE_DEFAULT;
end;
//к примеру определяем установлен ли Microsoft Visual C++ 2010 x86 Redistributable, ProductCode которого {196BB40D-1578-3D01-B289-BEFC77A11A1E}
procedure InitializeWizard();
begin
if IsMsiProductInstall('{196BB40D-1578-3D01-B289-BEFC77A11A1E}') then
MsgBox('vcredist 2010 installed for current user', mbInformation, MB_OK)
else
MsgBox('vcredist 2010 not installed', mbInformation, MB_OK);
end;
ProductCode можно посмотреть в msi-документе с помощью Orca (таблица Property, свойство ProductCode)
Более того, ProductCode индивидуален мало того что для каждого языка Microsoft Visual C++ 2015, так еще и для каждой его ревизии, получается целый паровоз вариантов
Цитата vk_k14m@vk:
Если он уже установлен и ты снова попытаешься его установить, установщик скажет тебе что он уже установлен? Или как нивчем не бывало продолжит установку? »
|
это зависит от прописанной реакции на установленный экземпляр проги, иногда и версии установленного приходится кейсить
Цитата vk_k14m@vk:
Если ты поставил на комп игру Doom. А потом случайно снова запустил установщик. Ну забыл ты что игра у тебя уже есть, склероз старческий. Тебе игра предложит установиться в тоже самое место, где она уже стоит. Откуда она это знает? »
|
плохой вариант по HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\GUID|AppName_is1
Хороший по ключу реестра, характерного для приложения, и наличия экзешника, например вот так определяется наличие проги и её версии
Код:

Function isSVPexist():boolean;
var moreOrEqual : boolean; s : string; VersionMS, VersionLS : cardinal;
begin
RegQueryStringValue(HKCU, 'Software\SVP','Path', s);
s := RemoveQuotes(s); s := RemoveBackslashUnlessRoot(s);
if (FileExists(s+'\SVPMgr.exe')) then begin
GetVersionNumbers(s+'\SVPMgr.exe', VersionMS, VersionLS);
moreOrEqual:=true;
if (VersionMS<$30000) then moreOrEqual:=false else begin
if ( (VersionMS=$30000) and (VersionLS<$FA) ) then moreOrEqual:=false
end;
Result := moreOrEqual;
end //(FileExists(s+'\SVPMgr.exe'))
else Result := False;
end;
Цитата ZVSRus:
А что вы обижаетесь, как вы задаете вопросы, так вам и отвечают. Как проверить что установлено, элементарно, даже средствами INNO. Если в секции [Setup] поставить директиву DirExistsWarning=yes тогда установщик при повторной установке будет видеть путь установки что прописан в директиве DefaultDirName=C:\Games\{#MyAppName}, если по данному пути что установлено, установщик предложит вам продолжить установку или отказаться. Вот от этого и нужно было изначально плясать. »
|
это плохой вариант
установщик тупо посмотрит в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}_is1 и если его нет поведет себя как будто проги нет в системе, а если ее ставили с другого установщика у которого другой GUID или {#MyAppName}?
Спорный способ
Цитата vk_k14m@vk:
И вообще. Я же сказал закрыть эту тему. Если она для вас настолько сложная, не нужно в нее вникать. Просто забудь. »
|
как скажешь