FREE Subscription to Dr. Dobb’s Digest: Same Great Content, New Digital Edition
Site Archive (Complete)
Dobbs M-Dev
Email
Print
Reprint

add to:
Del.icio.us
Digg
Google
Furl
Slashdot
Y! MyWeb
Blink
March 01, 2001

Customizing Windows Installer

(Page 22 of 24)
March 2001/Customizing Windows Installer/Listing 5

Listing 5: 1stfile.vbs — Inspecting file versions

Option Explicit

Public installer, database



Const msiOpenDatabaseModeReadOnly     = 0





' Connect to Windows Installer object

REM On Error Resume Next

Set installer = Nothing

Set installer = Wscript.CreateObject("WindowsInstaller.Installer")_

    : CheckError



' Open database

Dim databasePath:databasePath = "orca.msi"

Set database = installer.OpenDatabase(databasePath, _

    msiOpenDatabaseModeReadOnly) : CheckError



ListFiles



Wscript.Quit 0



' List all files in database

Sub ListFiles

Dim view, record, afile, aversion, fullmsg

    fullmsg = ""

    Set view = database.OpenView(_

        "SELECT `FileName`,`Version` FROM `File`") : CheckError

    view.Execute : CheckError

    Do

        Set record = view.Fetch : CheckError

        If record Is Nothing Then Exit Do

        afile = record.StringData(1)

        aversion = record.stringdata (2) 

        fullmsg = fullmsg & afile & " " & aversion & vbcrlf

    Loop

    msgbox fullmsg

End Sub







Sub CheckError

    Dim message, errRec

    If Err = 0 Then Exit Sub

    message = Err.Source & " " & Hex(Err) & ": " & Err.Description

    If Not installer Is Nothing Then

        Set errRec = installer.LastErrorRecord

        If Not errRec Is Nothing Then message = message & _

            vbLf & errRec.FormatText

    End If

    Fail message

End Sub



Sub Fail(message)

    Wscript.Echo message

    Wscript.Quit 2

End Sub
Return to article
 
Listing 2: manuf.vbs — Determining the BIOS version
dim Systemset, System, Bios, Manuf, Model, BiosVersion, BiosName



Set SystemSet = GetObject("winmgmts:").InstancesOf _

    ("Win32_ComputerSystem")



for each System in SystemSet

    Manuf = System.Manufacturer

    Model = System.Model

    exit for 

next



for each Bios in GetObject("winmgmts:").InstancesOf ("win32_bios")

        BiosName = Bios.name 

        BiosVersion = Bios.Version 

    exit for

next



if Manuf = "HP" and Left(Model, 9) = "NetServer" and _

        Left(BiosVersion, 9)="05/01/00" then

    Property("NEWBIOS") = "yes"

end if

Msgbox (Property("NEWBIOS")    )
Return to article
 
Listing 3: cadll.cpp — Finding shared files
#include "stdafx.h"

#include <stdio.h>

#include <MsiQuery.h>





BOOL APIENTRY DllMain( HANDLE hModule, 

                       DWORD  ul_reason_for_call, 

                       LPVOID lpReserved

                     )

{

    switch (ul_reason_for_call )

    {

     case DLL_PROCESS_ATTACH:

            break;

     case DLL_PROCESS_DETACH:



            break;

    }

    return TRUE;

}





UINT __stdcall FindShared(MSIHANDLE hInstall)

        

{

    

    HKEY hk;



    long res = RegOpenKeyEx (HKEY_LOCAL_MACHINE, 

        "Software\\MyCompany\\MyProduct\\MyFiles", 

        0, KEY_READ, &hk); 

    

    DWORD inx;

    char thevalue [MAX_PATH] = {0};

    DWORD buflen; 

    DWORD type;

    for (inx=0; 1; inx++ )

    {

    buflen = sizeof(thevalue);

    long regres = RegEnumValue(hk, inx, thevalue, 

        &buflen, NULL, &type, NULL, NULL);

    if (ERROR_SUCCESS==regres)

        {

            _strlwr (thevalue);

            char* pf = strstr (thevalue, "another.exe");

            if (pf!=NULL)

            {

                MsiSetProperty(hInstall, "FOUNDANOTHER", thevalue);

                break;

            }



        }

    else

        break;

    }





    RegCloseKey (hk);



    return 0;



}





//End of File
Return to article
 
Listing 4: findxl.vbs — Figuring out if Excel is installed
Option Explicit

Public installer, state, path

Const msiInstallStateDefault      =  5



' Connect to Windows Installer object

set installer = Wscript.CreateObject("WindowsInstaller.Installer")



state = installer.productstate _

    ("{00000409-78e1-11d2-b60f-006097c998e7}")



if state <> msiInstallStateDefault then 

   MsgBox ("Office not Installed " & state)

   Wscript.quit

end if



path = installer.ComponentPath _

    ("{00000409-78E1-11D2-B60F-006097C998E7}", _

    "{CC29E96F-7BC2-11D1-A921-00A0C91E2AA2}")

if path <> "" then

path = path & " Version " & installer.FileVersion (path, false)

end if

msgbox path
Return to article
 
Listing 5: 1stoff.vbs — Iterating through Installer collections
Option Explicit

Public installer, state, feature, product, component, fullmsg, num

Const msiInstallStateDefault      =  5



' Connect to Windows Installer object

set installer = Wscript.CreateObject("WindowsInstaller.Installer")





fullmsg = ""

for each product in installer.products

fullmsg = fullmsg & product & " " & installer.ProductInfo _

        (product, "InstalledProductName") & vbcrlf

next



msgbox fullmsg



state = installer.productstate _

    ("{00000409-78e1-11d2-b60f-006097c998e7}")



if state <> msiInstallStateDefault then 

   MsgBox ("Office not Installed " & state)

   Wscript.quit

end if

fullmsg = ""

for each feature in installer.features _

    ("{00000409-78e1-11d2-b60f-006097c998e7}")

   fullmsg = fullmsg & feature & " " & installer.FeatureState _

    ("{00000409-78e1-11d2-b60f-006097c998e7}", feature) & vbcrlf

next

msgbox fullmsg
Return to article
 
Listing 6: listobjs.cpp — Enumerating Platform SDK components
// ListObjs.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <windows.h>

#include <msi.h>

#include <stdio.h>

int main(int argc, char* argv[])

{

    FILE *listdata;

    listdata = fopen  ("lstobjs.txt" , "w"); 



    char cbuff [100];

    char pbuff[100];

    char pathbuff [MAX_PATH];

    char descbuff [500]; 

    const char psdkproduct [] = "{FB392771-9E4A-4DF8-9262-080BD65C0967}";



    INSTALLSTATE sval = MsiQueryProductState (psdkproduct); 

    if (sval != INSTALLSTATE_DEFAULT)

    {

        fprintf (listdata, "Platform SDK not installed\n");

        return 0;

    }

    DWORD dwdescbuff = sizeof(descbuff);

    UINT pi = MsiGetProductInfo (psdkproduct, 

        INSTALLPROPERTY_INSTALLEDPRODUCTNAME, 

        descbuff, &dwdescbuff);

    fprintf (listdata, "%s \n", descbuff);

    DWORD ix = 0; 

    for (ix=0; 1; ix++)

    {

        UINT urc;

        urc = MsiEnumComponents (ix, cbuff);

        if (ERROR_SUCCESS!=urc)

            break;

        UINT urp = MsiGetProductCode (cbuff, pbuff); 

        if (_stricmp (psdkproduct, pbuff) ==0)

        {

            DWORD dwpathbufflen = sizeof (pathbuff);

            INSTALLSTATE ival = MsiGetComponentPath (pbuff,

                cbuff, pathbuff, &dwpathbufflen);

            if (INSTALLSTATE_LOCAL==ival)

            {

                 // starts with a zero - it's a registry key 

                if (memcmp (pathbuff, "0", 1) ==0)

                {

                    char regname [MAX_PATH] = {0};

                    switch (pathbuff[1]) 

                    {

                    case '0': strcpy (regname, "HKCR"); break;

                    case '1': strcpy (regname, "HKCU"); break;

                    case '2': strcpy (regname, "HKLM"); break;

                    case '3': strcpy (regname, "HKUSERS"); break;

                    }

                    strcat (regname, pathbuff+3);

                    strcpy (pathbuff, regname);

                }



                fprintf(listdata, "Component %s installed at %s\n",

                        cbuff, pathbuff);

            }

        }






    }

    return 0;

}

//End of File

Previous Page | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 Next Page
TOP 5 ARTICLES
No Top Articles.



MICROSITES
FEATURED TOPIC

ADDITIONAL TOPICS

INFO-LINK