czwartek, 5 lipca 2012

Pobranie ścieżki instalacyjnej zainstalowanego produktu po przez GUID - Get Install location by Product GUID in InstallShield

Przy tworzeniu aktualizacji czasami zachodzi potrzeba odczytania ścieżki instalacyjnej zainstalowanego wcześniej produktu. Jeżeli mamy GUID poprzedniego produktu możemy do tego wykorzystać poniższą funkcję. Funkcja odczytuje wartości rejestru zainstalowanych produktów.
Parametry:
  • GUID  - GUID zainstalowanego  produktu\
  • Path - odczytana ścieżka
  • Name - odczytana nazwa produktu
  • Version - odczytana wersja zainstalowanego produktu
  • bLog - zapis do loga 

Funkcja zwraca true/false, wartość true w przypadku pozytywnego odczytania ścieżki instalacyjnej.

Nagłówek funkcji

export prototype BOOL GetInstallLocationGUID(STRING, /*GUID*/ BYREF STRING /*Path*/, BYREF STRING /*Name*/, BYREF STRING /*Version*/, BOOL /*bLog*/); 

Ciało funkcji
function BOOL GetInstallLocationGUID(szGUID, svPath, svName, svVersion, bLog)
#define UKEY  "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
string RegPath, sKey, sValue, sData, sFolder;   
number nReturn, nResult, nType, nSize, i, nData;
BOOL bResult;
LIST   listSubKeys;
begin
  bResult = FALSE;
  
  if (bLog) then  WriteLog(1,"Odczyt ścieżki do zainstalowanego produktu"); endif;   
   
  listSubKeys  =  ListCreate(STRINGLIST);   
  RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
  nReturn = RegDBQueryKey(UKEY, REGDB_KEYS, listSubKeys );
  if (nReturn=0) then
   ListGetFirstString ( listSubKeys, sKey );
   if (ListCount(listSubKeys)>0) then        
       
     ListSetIndex(listSubKeys, LISTFIRST);
     for i=0 to ListCount(listSubKeys)-1
       ListCurrentString ( listSubKeys, sKey ); 
       if (sKey==szGUID) then                                 
         if (bLog) then  WriteLog(2,"- znaleziono zainstalowany produkt "+szGUID); endif;   
                
         RegPath=UKEY+"\\"+sKey;
         sFolder=sKey;
         if (RegDBKeyExist(RegPath)==1) then                      
                         
            sKey = RegPath;                            
            sValue="DisplayName";
            nType = REGDB_STRING;
            if (RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize )==0) then
              svName = sData;
              if (bLog) then  WriteLog(3,"- nazwa produktu "+sData); endif;   
            else
              svName = "";
              if (bLog) then WriteLog(3,"- brak klucza nazwy produktu "); endif;   
            endif;                         
                                                   
            sValue="DisplayVersion";                         
            if (RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize )==0) then
             svVersion = sData;
             if (bLog) then  WriteLog(3,"- wersja produktu "+sData); endif;   
            else
             svVersion = "";
             if (bLog) then  WriteLog(3,"- brak klucza wersji produktu "); endif;   
            endif;
                         
            sValue="InstallLocation";                                   
            if (RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize )==0) then
              if (bLog) then  WriteLog(3,"- ścieżka instalacji "+sData); endif;          

              svPath = sData;
              bResult = TRUE;
            else
              if (bLog) then  WriteLog(3,"- brak klucza ścieżki instalacyjne "); endif;   
            endif;
                        
            sValue="InstallDate";                                   
            if (RegDBGetKeyValueEx( sKey, sValue, nType, sData, nSize )==0) then
              if (bLog) then  WriteLog(3,"- data instalacji "+sData); endif;                                
              bResult = TRUE;
            else
              if (bLog) then  WriteLog(3,"- brak klucza daty instalacji "); endif;   
            endif;
          endif;
        endif;   
                 
        ListSetIndex(listSubKeys, LISTNEXT);
      endfor;
         
    else
      if (bLog) then  WriteLog(2,"- brak listy zainstalowanych produktow GUID"); endif;   
    endif;
     
   else
     if (bLog) then  WriteLog(2,"- błąd odczytu rejestru"); endif;   
   endif;           

  return bResult;         
end;


Oprócz ścieżki instalacyjnej (Path) , funkcja zwraca nazwę produktu (Name) i wersję (Version)

Brak komentarzy:

Prześlij komentarz