Inno Setup Тест

nik1967

Old Men
Проверенный
Всем доброго времени суток! У кого найдётся свободная минутка, прошу запустить сей файлик и отписаться, правду ли он показал. Интересует только название вендора (NVIDIA или AMD) и разрядность системы. Особенно приветствуются запуски на смешанной графике типа эндуро, или оптимус. У кого ТОЛЬКО встроенная графика от INTEL, может не качать. Всё равно выдаст "Не удалось определить видеокарту". Так, как ещё раз повторюсь: интересуют только NVIDIA и AMD.

Ах, да! Для сомневающихся. https://www.virustotal.com/ru/file/...6066f133de30d70fd9c4f2e5/analysis/1448213754/
 

Вложения

  • 324.1 KB Просмотры: 86
Последнее редактирование:

Devils Night

Ветеран
Все ок, правильно определяет видяху. Блин, забыл, про разрядность, разрядность тоже определяет как надо. Так что все пучком.
 

Snoopak96

Старожил
nik1967,
На оптимусе выдаёт дискретную картачку, на интегрированную же интел просто забивает. Ну собсно думаю будет полезно http://krinkels.org/threads/faq-po-inno-setup.7/page-4#post-25723 - и без разницы какая видеокарта.
тоже как-то брался за системки, пришёл к выводу что без биоса не обойтись - оценивать по объёму видеопамяти в наше время глупо минимум. Но на данный момент катастрофически мало свободного времени - увы.
 

nik1967

Old Men
Проверенный
На оптимусе выдаёт дискретную картачку, на интегрированную же интел просто забивает.
Дык на это и расчёт был. Чтобы определить именно дискретную. Так, как почти везде определяется интегрированная (на гибридных системах). И да, мне (даже не мне) нужно было просто определить вендора, даже без точного названия карточки и объёма памяти. Что и сделал.
Реестр. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}. Что для XP, что для 10. Кстати, там же можно найти информацию и о видеопамяти. HardwareInformation.MemorySize. В байтах.
Примерно так:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
   VKName,VKName1,S: String;

function AMD: Boolean;
begin
   if not RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then VKName:= ' ';
   if not RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0001\Settings','Device Description',VKName1) then VKName1:= ' ';
   S:= VKName1+' + '+VKName;
   Result:= Pos('Radeon',S)>0;
end;

function NVIDIA: Boolean;
begin
   if not RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then VKName:= ' ';
   if not RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0001\Settings','Device Description',VKName1) then VKName1:= ' ';
   S:= VKName1+' + '+VKName;
   Result:= Pos('GeForce',S)>0;
end;

function InitializeSetup: Boolean;
begin
  if (AMD and IsWin64) then
     MsgBox('Видеокарта: AMD'+#13#10+'Система: x64',mbInformation, mb_Ok)
   else
   if (AMD and not IsWin64) then
     MsgBox('Видеокарта: AMD'+#13#10+'Система: x86',mbInformation, mb_Ok)
   else
   if (NVIDIA and IsWin64) then
     MsgBox('Видеокарта: NVIDIA'+#13#10+'Система: x64',mbInformation, mb_Ok)
   else
   if (NVIDIA and not IsWin64) then
     MsgBox('Видеокарта: NVIDIA'+#13#10+'Система: x86',mbInformation, mb_Ok)
   else
   if not (AMD or NVIDIA) then
     MsgBox('Не удалось определить видеокарту',mbInformation, mb_Ok);
   Result:= false;
end;
Почему Radeon и GeForce, а на AMD и NVIDIA? У одного знакомого не правильно отработало из-за интегрированной карточки от AMD.
Принимаю критику и разнос от Сергея (Snoopak96) за дилетантство, но ведь ... работает.
 
Последнее редактирование:

Snoopak96

Старожил
nik1967,
не, реестр это мусорка винды, да и все мы знаем про сборки и прямые руки авторов этих сборок, по этому реестр не вариант.
 

SBalykov

Старожил
Дык на это и расчёт был. Чтобы определить именно дискретную. Так, как почти везде определяется интегрированная (на гибридных системах). И да, мне (даже не мне) нужно было просто определить вендора, даже без точного названия карточки и объёма памяти. Что и сделал.
По-моему, для правильного определения дискретной видеокарты, необходимо добавить:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
VKName: array [0..3] of String;
S: String;

function AMD: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName[0])
then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0001\Settings','Device Description',VKName[1])
then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0002\Settings','Device Description',VKName[2])
then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0003\Settings','Device Description',VKName[3])
then
S:= VKName[3]+' + '+ VKName[0];
Result:= Pos('AMD',S)>0;
end;

function NVIDIA: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName[0])
then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0001\Settings','Device Description',VKName[1])
then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0002\Settings','Device Description',VKName[2])
then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0003\Settings','Device Description',VKName[3])
then
S:= VKName[3]+' + '+ VKName[0];
Result:= Pos('NVIDIA',S)>0;
end;

function InitializeSetup: Boolean;
begin
if (AMD and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok)
else
if (AMD and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok)
else
if (NVIDIA and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok)
else
if (NVIDIA and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok)
else
if not (AMD and NVIDIA) then
MsgBox(VKName[0],mbInformation, mb_Ok);
Result:= false;
end;
Немного подправил ...
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
S,VKName,VKName1: String;

function AMD: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0003\Settings','Device Description',VKName1) then
S:= VKName1+' + '+VKName;
Result:= Pos('AMD',S)>0;
end;

function NVIDIA: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0003\Settings','Device Description',VKName1) then
S:= VKName1+' + '+VKName;
Result:= Pos('NVIDIA',S)>0;
end;

function VCardAMD: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then
S:= VKName;
Result:= Pos('AMD',S)>0;
end;

function VCardNVIDIA: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then
S:= VKName;
Result:= Pos('NVIDIA',S)>0;
end;

function InitializeSetup: Boolean;
begin
if (AMD and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (AMD and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if (NVIDIA and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (NVIDIA and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if (VCardAMD and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (VCardAMD and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if (VCardNVIDIA and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (VCardNVIDIA and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if not (AMD and NVIDIA and VCardAMD and VCardNVIDIA) then
MsgBox(VKName+#13#10+'Видеокарта не поддерживается',mbInformation, mb_Ok)
Result:= false;
end;
Упрощенный вариант:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
S,VKName,VKName1: String;

function VCard: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0003\Settings','Device Description',VKName1) then
S:= VKName1+' + '+VKName;
Result:= Pos('AMD',S)<>Pos('NVIDIA',S);
end;

function VCard1: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then
S:= VKName;
Result:= Pos('AMD',S)<>Pos('NVIDIA',S);
end;

function InitializeSetup: Boolean;
begin
if (VCard and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (VCard and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if (VCard1 and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (VCard1 and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if not (VCard and VCard1) then
MsgBox(VKName+#13#10+'Видеокарта не поддерживается',mbInformation, mb_Ok)
Result:= false;
end;

Вложение проверено
 

Вложения

  • 324.8 KB Просмотры: 8
Последнее редактирование:

nik1967

Old Men
Проверенный
SBalykov, думаешь я зря здесь выкладывал на тест, да ещё в скайпе куче знакомых? У всех определило правильно. Мой вариант более работоспособный, как мне кажется. Вот что твой выдал:

У меня эта видеокарта интегрирована в камень (эндуро). Почти все определители сис. требований выдают то-же. А мой вариант правильно определяет:
 

SBalykov

Старожил
nik1967
Что ты кипятишься.
У меня при твоем способе не отображается дискретка на ноуте Lenovo.
Ну, значит не судьба.
У меня на двух ноутах дискретную карту определяет нормально, что в принципе говорит о том, что универсальных, простых способов не существует ...
Попробуй вот так:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
S,VKName: String;

function VCard: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0001\Settings','Device Description',VKName) then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0002\Settings','Device Description',VKName) then
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0003\Settings','Device Description',VKName) then
S:= VKName;
Result:= Pos('AMD',S)<>Pos('NVIDIA',S);
end;

function VCard1: Boolean;
begin
if RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings','Device Description',VKName) then
S:= VKName;
Result:= Pos('AMD',S)<>Pos('NVIDIA',S);
end;

function InitializeSetup: Boolean;
begin
if (VCard and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (VCard and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if (VCard1 and IsWin64) then
MsgBox(S+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (VCard1 and not IsWin64) then
MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if not (VCard and VCard1) then
MsgBox(VKName+#13#10+'Видеокарта не поддерживается',mbInformation, mb_Ok)
Result:= false;
end;

nik1967
Я, как бабуин, изначально повторил не правильно и понеслось ...
А ошибка в условиях, которые не нужны
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
S,VKName: String;

function VCard: Boolean;
begin
RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0001\Settings\','Device Description',VKName);
RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0002\Settings\','Device Description',VKName);
RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0003\Settings\','Device Description',VKName);
S:= VKName;
Result:= Pos('AMD',S)<>Pos('NVIDIA',S);
end;

function VCard1: Boolean;
begin
RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\Settings\','Device Description',VKName);
S:= VKName;
Result:= Pos('AMD',S)<>Pos('NVIDIA',S);
end;

function InitializeSetup: Boolean;
begin
if (VCard and IsWin64) then MsgBox(S+#13#10+Система: x64',mbInformation, mb_Ok) else
if (VCard and not IsWin64) then MsgBox(S+#13#10+'Система: x86',mbInformation, mb_Ok) else
if (VCard1 and IsWin64) then MsgBox(s+#13#10+'Система: x64',mbInformation, mb_Ok) else
if (VCard1 and not IsWin64) then MsgBox(s+#13#10+'Ñèñòåìà: x86',mbInformation, mb_Ok) else
if not (VCard and VCard1) then MsgBox(VKName+#13#10+'Не поддерживается',mbInformation, mb_Ok);
Result:= false;
end;
 
Последнее редактирование:

nik1967

Old Men
Проверенный
У меня при твоем способе не отображается дискретка на ноуте Lenovo.
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
   VKName: String;
 
function FindName: String;
var
   i: Integer;
begin
  for i:= 0 to 9 do begin
     RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+inttostr(i)+'\Settings','Device Description',VKName);
     Result:= VKName;
   end; 
end;

function AMD: Boolean;
begin
   FindName;
   Result:= Pos('Radeon',VKName)>0;
end;

function NVIDIA: Boolean;
begin
   FindName;
   Result:= Pos('GeForce',VKName)>0;
end;

function InitializeSetup: Boolean;
begin
   if (AMD and IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x64',mbInformation, mb_Ok)
   else
   if (AMD and not IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x86',mbInformation, mb_Ok)
   else
   if (NVIDIA and IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x64',mbInformation, mb_Ok)
   else
   if (NVIDIA and not IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x86',mbInformation, mb_Ok)
   else
   if not (AMD or NVIDIA) then
     MsgBox('Не удалось определить видеокарту',mbInformation, mb_Ok);
     Result:= false;
end;
 

SBalykov

Старожил
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
   VKName: String;

function FindName: String;
var
   i: Integer;
begin
  for i:= 0 to 9 do begin
     RegQueryStringValue(HKLM,'SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+inttostr(i)+'\Settings','Device Description',VKName);
     Result:= VKName;
   end;
end;

function AMD: Boolean;
begin
   FindName;
   Result:= Pos('Radeon',VKName)>0;
end;

function NVIDIA: Boolean;
begin
   FindName;
   Result:= Pos('GeForce',VKName)>0;
end;

function InitializeSetup: Boolean;
begin
   if (AMD and IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x64',mbInformation, mb_Ok)
   else
   if (AMD and not IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x86',mbInformation, mb_Ok)
   else
   if (NVIDIA and IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x64',mbInformation, mb_Ok)
   else
   if (NVIDIA and not IsWin64) then
     MsgBox('Видеокарта: '+VKName+#13#10+'Система: x86',mbInformation, mb_Ok)
   else
   if not (AMD or NVIDIA) then
     MsgBox('Не удалось определить видеокарту',mbInformation, mb_Ok);
     Result:= false;
end;
Спасибо. Нормально.
Я уже сделал, только немного покороче.
Ты зачем отдельно проверяешь AMD и NVIDIA, можно же в одну проверку:
Result:= Pos('Radeon',VKName) <> Pos('GeForce',VKName);
соответственно и далее убрать лишнее
Вообще, спасибо за идею, натолкунуло на мысль ...
 
Сверху