[INNOSetup, Pascal]Detectie VC++ Redistributable

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een nieuwe versie van een installer, gemaakt met INNOSetup.
Voor deze nieuwe versie zijn alleen 'Power User' rechten nodig, niet langer 'Admin' rechten.

We moeten nu dus eerst checken of de gebruiker 'Microsoft Visual C++ 2008 Redistributable' al heeft geinstalleerd, omdat die wel 'Admin' rechten behoeft.

Ik ben hier al lang mee bezig, maar ik kom er niet uit.
Ik check op {9A25302D-30C0-39D9-BD6F-21E6EC160475} met dit stukje code:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function MsiQueryProductState(ProductCode: string): integer;
external 'MsiQueryProductStateA@msi.dll';

const
  INSTALLSTATE_DEFAULT = 5;
  INSTALLLEVEL_MAXIMUM = $ffff;
  INSTALLSTATE_ABSENT = 2;

const
    VCREDIST_X86 ='{9A25302D-30C0-39D9-BD6F-21E6EC160475}';

function IsMsiProductInstalled(const ProductId: string): boolean;
begin
    Result := MsiQueryProductState(ProductId) = INSTALLSTATE_DEFAULT;
end;

function NeedInstallVC8(): Boolean;
begin
    Result := IsMsiProductInstalled(VCREDIST_X86);
#ifdef Debug
  if Result then
  begin
        MsgBox('Could not find VCREDIST, will install', mbInformation, MB_OK);
    end
    else
    begin
        MsgBox('Found VCREDIST, no need to install', mbInformation, MB_OK);
    end;
#endif
end;

function InitializeSetup(): Boolean;
var
begin

  // Check for prerequisites
    Result := CheckDotNetVersions();

    vc8Missing := NeedInstallVC8();

  Result := Result And vc8Missing;
end;



Maar ook al heb ik die versie geinstalleerd op mijn pc en is {9A25302D-30C0-39D9-BD6F-21E6EC160475} aanwezig in mijn registry, het resultaat is altijd dat VCRedist niet is geinstalleerd.

Mijn vraag is dan ook hoe kan ik het wel juist detecteren?

Mijn tweede vraag is, als de detectie werkt moet de VC++ installer gestart worden onder een Admin-account. Hoe kan ik het commando 'Run As' uitvoeren en zo het standaard Windows inlogscherm tonen?

[Edit:]
Ik heb wat messageboxen toegevoegd en nog meer gegoogled en nu blijkt dat MsiQueryProductState(ProductId) INSTALLSTATE_INVALIDARG terug geeft.
Maar ik kan niet vinden hoe ik het dan moet doen.

[ Voor 5% gewijzigd door Verwijderd op 23-04-2010 12:09 ]


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
Als ik hier kijk zie ik dat diegene de dll import als volgt gedaan heeft:

Delphi:
1
2
function MsiQueryProductState(szProduct: String): Integer;
external 'MsiQueryProductStateA@msi.dll stdcall';


Let vooral op het laatste 'stdcall'. Misschien helpt het als je dat op die manier aanroept?

Hail to the king baby!


Acties:
  • 0 Henk 'm!

Verwijderd

urk_forever schreef op vrijdag 23 april 2010 @ 14:46:
Als ik hier kijk zie ik dat diegene de dll import als volgt gedaan heeft:

Delphi:
1
2
function MsiQueryProductState(szProduct: String): Integer;
external 'MsiQueryProductStateA@msi.dll stdcall';


Let vooral op het laatste 'stdcall'. Misschien helpt het als je dat op die manier aanroept?
die stdcall is zeker van belang, anders stuur je gewoon een pascal string (en wat voor een dat dan is is afhankelijk van je pascal/delphi versie.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het met stdcall geprobeerd, maar het resultaat is hetzelfde. Ik blijf -2 (INSTALLSTATE_INVALIDARG) terug krijgen.
Ook als ik de installatie uitvoer als dezelfde gebruiker (met admin rechten) die de VC++ Redist. heeft geinstalleerd.

Acties:
  • 0 Henk 'm!

Verwijderd

Hier werkt het prima (Delphi 7),
denk dat er wat met je strings misgaat.

Welke pascal compiler gebruik je ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik ISTool 5.3.0.1 en INNOSetup 5.3.9 (laatste versie).
Ik kan niet zien welke Pascal compiler zij gebruiken.

Er werd me net nog een andere optie aangeboden.
Via RegOpenKeyEx de waarde uitlezen.
Dat ga ik zodadelijk proberen.

Acties:
  • 0 Henk 'm!

Verwijderd

ah, dat is pascal script of zoiets
hier staat een en ander (lees de replies op de fp):
http://stackoverflow.com/...h-parameter-in-inno-setup

je zou dus met Pchar moeten proberen ipv String.

Acties:
  • 0 Henk 'm!

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14:30
Ik ken Pascal script niet echt, maar zou deze werken?

Delphi:
1
2
function MsiQueryProductState(const ProductCode: string): integer;
external 'MsiQueryProductStateA@msi.dll stdcall';


of

Delphi:
1
2
function MsiQueryProductState(const ProductCode: PAnsiChar): integer;
external 'MsiQueryProductStateA@msi.dll stdcall';

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank allen!
Het is gelukt. Met PChar wil het niet, dan geeft de compiler een foutmelding maar met PAnsiChar werkt het wel.

De werkende code is:
Delphi:
1
2
function MsiQueryProductState(ProductCode: PAnsiChar): Integer;
external 'MsiQueryProductStateA@msi.dll stdcall';


Overigens werkt het ook met de reg key opvragen:
Delphi:
1
2
Installed: cardinal;
RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + ProductId, 'WindowsInstaller', Installed);

Installed is 1 als VC++ al is geinstalleerd en anders 0

Ik zit nu alleen nog met het aanroepen van de VC++ installer als een andere gebruiker.
Ik gebruik deze regel voor de .NET installers:
Delphi:
1
ShellExec('open', DOTNETInstaller, '', '', SW_SHOW, ewNoWait, ErrorCode);


Maar de VC++ installer heeft admin rechten nodig.

Iemand een idee?

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
Krijg je niet automatisch een UAC melding als je die regel uit voert voor de Admin rechten?

Hail to the king baby!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik krijg een melding van de VC++ installer dat die admin rechten nodig heeft. Vervolgens kan er alleen op OK worden geklikt en moet de gebruiker de hele installer opnieuw starten, nu met admin rechten.
De VC++ installer zit nl. in mijn eigen installer.

Acties:
  • 0 Henk 'm!

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-08 14:24

ZaZ

Tweakers abonnee

Heeft je eigen installer admin rechten? Dan moet je waarschijnlijk nog de runascurrentuser flag toevoegen.
Op een of andere manier inherit ie dat niet in alle gevallen standaard.

Lekker op de bank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil juist niet dat mijn installer admin rechten nodig heeft. Dat heeft die ook niet nodig, alleen als de VC++ geinstalleerd moet worden.
In mijn install script heb ik aangegeven dat poweruser rechten voldoende zijn.
Ik ben nu bezig om de check op VC++ uit te voeren in de PrepareToInstall, zodat ik eerder kan aangeven dat de gebruiker mijn installer opnieuw moet starten met admin rechten.
Als dat werkt verwijder ik de VC++ installer uit de Run sectie.

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 14-09 19:30

alienfruit

the alien you never expected

Het is van de maker van Delphi Prism (eerder bekend als Chrome) en je kan meer informatie vinden op:
http://www.remobjects.com/ps.aspx
Pagina: 1