czwartek, 28 października 2010

Restart systemu podczas instalacji i kontynuowanie InstallShield

Prosta funkcja, która pozwala zapisać parametry restartu systemu i uruchomienie instalatora z odpowiednimi parametrami

function VOID RestartAndRun(szParams)
string RegPath,sVersion,sVer;
number nSize,nType,nResult;
begin
  RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);          
  RegPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce";
  nType = REGDB_STRING; 
  nSize = -1;
  RegDBSetKeyValueEx (RegPath, "setup.exe", nType, szParams, nSize);
  
end;

Odczyt wersji zdalnego serwera SQL InstallShield

Funkcja odczytuje wersję serwera SQL. Wymaganiem jest podanie użytkownika z dostępem do bazy master serwera.
Parametry:
-sServerName - nazwa serwera zdalnego (z instancją)
-sUserName - nazwa użytkownika
-sUserPwd - hasło użytkownika
- bLog - zapis do pliku log
Wartości zwracane:
-1 - nie udało się pobrać wersji serwera
80 - SQL2000
90 - SQL2005
100 -SQL2008

function int GetRemoteSQLVersion(sServerName, sUserName, sUserPwd,  bLog)
OBJECT objConn, objRST;      
STRING sConnString;  
STRING  szADOConnObjID;
STRING sSQL,szVersion, szVer;
int nResult;
begin
 nResult = -1;

     sConnString = "Driver={SQL Server};Persist Security Info=False;";
     sConnString = sConnString + "server=" + sServerName + ";";
  sConnString = sConnString + "uid=" + sUserName + ";";                                                       
  sConnString = sConnString + "pwd=" + sUserPwd + ";";
  sConnString = sConnString + "database=master"; 
 
  sSQL = "SELECT SERVERPROPERTY('ProductVersion') AS ProductVersion";
 try
  if (bLog) then WriteLog(0,"* Odczyt wersji Serwera SQL..."); endif;
  
  szADOConnObjID = "ADODB.Connection";
     set objConn = CreateObject(szADOConnObjID);         
    
  if (IsObject(objConn)) then 
   objConn.ConnectionString = sConnString;
   //objConn.CommandTimeout = 999999;   
   objConn.Open;                            
         set objRST = objConn.Execute(sSQL);                    
   szVersion = objRST("ProductVersion");   
         if (StrLength(szVersion)>0) then
          StrSub(szVer,szVersion,0,StrFind(szVersion,"."));                    
          switch (szVer)
            case "8" : nResult=80; if (bLog) then WriteLog(1,"- Serwera SQL 2000"); endif;
            case "9" : nResult=90; if (bLog) then WriteLog(1,"- Serwera SQL 2005"); endif;
            case "10": nResult=100;if (bLog) then WriteLog(1,"- Serwera SQL 2008"); endif;
          endswitch;                   
         endif;         
         objConn.Close;         
  endif;
  
  set objConn = NOTHING;    
  set objRST  = NOTHING;
  
 catch  
  if (bLog) then WriteLog(1," - Nie można uzyskać połączenia z bazą master na 
użytkownika \""+sUserName+"\""); endif;    
 endcatch;
 
 return nResult; 
end;

Odczyt prędkości procesora InstallShield

Funkcja zwraca wartość numeryczną podaną w MHz - pierwszego jądra procesora

function NUMBER GetCPUSpeed( bLog)
STRING svValue;
NUMBER nvType, nvSize, nSpeed;

begin
    RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
    nvSize = -1;
    nvType  = REGDB_STRING;
    RegDBGetKeyValueEx("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
 "~MHz", nvType, svValue, nvSize);
    if (bLog) then WriteLog(1,"- taktowanie procesora: "+svValue+"MHz"); endif;    
    StrToNum(nSpeed,svValue);
    return nSpeed;
end;

Uruchomienie domyślnej przeglądarki z adresem URL strony InstallShield

Funkcja Otwiera stronę o podanym adresie URL (szlink) w domyślnej przeglądarce internetowej
Parametry:
-szlink - adres URL strony
-bLog - zapis do pliku log
Wartości zwracane: true/false;

function BOOL StartWebPage(szlink, bLog)
LIST listSubKeys;
STRING KLUCZ, sKey;
NUMBER nReturn, nType, nSize;
BOOL bResult;
begin
 if (bLog) then WriteLog(0,"* Uruchomienie przeglądarki ze stroną:"+szlink); endif;
 bResult = FALSE;
 
 RegDBSetDefaultRoot(HKEY_CLASSES_ROOT); 
    KLUCZ = "http\\shell\\open\\command"; 
    if (RegDBGetKeyValueEx(KLUCZ, "", nType , sKey, nSize )=0 ) then
    
     StrReplace(sKey,'"','',0);
     if (StrFind(sKey,"exe")>0) then
        StrSub(sKey, sKey,0,StrFind(sKey,"exe")+3);       
     endif;
      
     sKey = '"' + sKey + '"';
     
     
     if (LaunchApplication (sKey, szlink, "", SW_NORMAL, 0, LAAW_OPTION_USE_SHELLEXECUTE | 
LAAW_OPTION_NOWAIT | LAAW_OPTION_SHOW_HOURGLASS)== ISERR_SUCCESS ) then
     //if LaunchApp(sKey, szlink)=0 then
      bResult = TRUE; 
      if (bLog) then WriteLog(2,"-uruchomiono"); endif;
     else
      if (bLog) then 
       WriteLog(2,"-nie udało się uruchomić przeglądarki"); 
       WriteLog(2," polecenie: "+sKey+", parametr: "+szlink);       
      endif; 
     endif;
    else    
     if (bLog) then WriteLog(1,"- nie mogę odczytać klucza: HKEY_CLASSES_ROOT\\"+ KLUCZ); endif;      
    endif;
    
    return bResult;
end;

Odczyt ścieżki do pliku php.ini z konfiguracji serwera Apache

Funkcja umożliwia pobranie ścieżki do pliku php.ini bezpośrednio z pliku konfiguracji serwera Apache.
Parametry:
-szApacheConfigFile - ścieżka z plikiem konfiguracji apache
-svPHPIniDir - parametr referencyjny (zwraca ścieżkę pliku php.ini)
-bLog - plik log
Uwaga: Parametr svPHPIniDir jest wskaźnikiem i musi być wcześniej zadeklarowany
Wartości zwracane: true/false - chyba jasne :)

function BOOL GetApachePHPIniDir(szApacheConfigFile, svPHPIniDir, bLog)
BOOL bResult;
LIST lsApache;
string szLine;
int i;
begin
 if (bLog) then WriteLog(0,"* Pobieranie scieżki do php ini z konfiguracji Apache..."); endif;
 bResult = FALSE;
 if (Is(FILE_EXISTS,szApacheConfigFile)) then
  lsApache = ListCreate(STRINGLIST);
  ListReadFromFile ( lsApache, szApacheConfigFile ); //Odczyt Apache Conf
  if (ListCount(lsApache)>0) then         
          ListSetIndex(lsApache,LISTFIRST);          
      for i=0 to ListCount(lsApache)-1        
       ListCurrentString ( lsApache, szLine ); 
     szLine = StrTrim(szLine);
     if (StrFind(szLine, "PHPIniDir")=0) then
      StrSub(svPHPIniDir, szLine, 9, StrLength(szLine));
      svPHPIniDir = StrTrim(svPHPIniDir);
      StrReplace(svPHPIniDir,'"','',0);
      StrReplace(svPHPIniDir,"/","\\",0);
      if (bLog) then WriteLog(1,"- ścieżka do php.ini: "+svPHPIniDir); endif;
      bResult = TRUE;
       endif;
       ListSetIndex(lsApache,LISTNEXT);
      endfor; 
    endif;    
 endif;
 
 ListDestroy(lsApache);
 
 return bResult;
end;

Instalacja serwera Apache w trybie cichym w Installshield

Funkcja Instaluje Serwer Apache w trybie cichym.
Parametry:
- szPlik - Plik instalatora msi
- szPort - Port na którym serwer Apache ma prowadzić nasłuch
- szService - nazwa serwisu Apache
- bLog - zapisywanie wyniku do pliku log
Wartości zwracane: false/true

function BOOL InstallApacheServer(szPlik, szPort, szService, bLog)
string szParams;
BOOL bResult;
number nResult;
begin
 bResult = FALSE; 
 if (bLog) then WriteLog(0,"* Instalacja serwera Apache..."); endif;  
 szParams = " /i \""+szPlik+"\" /passive /l \""+TARGETDIR ^ "apache_install.log\"
 SERVERADMIN=admin@localhost SERVERPORT="+szPort;
 if (LaunchApplication(WINSYSDIR ^ "msiexec.exe", szParams, "" , SW_HIDE, 0, 
LAAW_OPTION_USE_SHELLEXECUTE | LAAW_OPTION_WAIT | LAAW_OPTION_SHOW_HOURGLASS )<0) then
  WriteLog(2,"Błąd: Nie można zainstalować serwera Apache ");
     MessageBox ("Nie można zainstalować Serwera Apache", SEVERE);
    else
     while ((!(Is(FILE_EXISTS, TARGETDIR ^ "apache_install.log"))) || 
( (Is(FILE_EXISTS, TARGETDIR ^ "apache_install.log"))&&
(Is(FILE_LOCKED,TARGETDIR ^ "apache_install.log")) )  );
      Sleep(200);
     endwhile;
     bResult = TRUE;                
     if (bLog) then WriteLog(2,"-zainstalowano serwer, nasłuch na porcie:"+szPort+""); endif;
    endif; 
 return bResult;
end;

poniedziałek, 25 października 2010

Instalacja, obsługa usługi serwera Apache 2.x w InstallShield

Funkcja pozwala na zainstalowanie, deinstalację, aktualizację, uruchomienie, zatrzymanie usługi serwera Apache

Parametry:
  • szPath - ścieżka do zainstalowanego serwera
  • szFile - nazwa pliku serwera Apache
  • nAction - wybrana akcja 0..4 (patrz poniżej)
  • bLog - czy rejestrować w logu informacje


    Uwaga: Funkcja korzysta z zewnętrznej funkcji SdShowMsgWait()

    function BOOL ApacheService(szPath, szFile, szService, nAction, bLog)
    BOOL bResult;
    STRING szAction, szLog, szMsg;
    number nvState;
    begin
     bResult = FALSE;
     switch (nAction)
      case 0: if (StrLength(szService)=0) then
         szAction = " -k stop ";
         szLog = "- zatrzymanie usługi Apache";                 
        else
         szAction = " -k stop -n \""+szService+"\" ";
         szLog = "- zatrzymanie usługi Apache jako \""+szService+"\"";    
        endif; 
        szMsg = "Zatrzymanie serwera Apache...";
      case 1: if (StrLength(szService)=0) then
         szAction = " -k start ";
         szLog = "- uruchomienie usługi Apache";            
        else
         szAction = " -k start -n \""+szService+"\" ";
         szLog = "- uruchomienie usługi Apache jako \""+szService+"\"";    
        endif; 
        szMsg = "Uruchomienie serwera Apache...";
      case 2: if (StrLength(szService)=0) then
         szAction = " -k restart ";
         szLog = "- restart usługi Apache";            
        else
         szAction = " -k restart -n \""+szService+"\" ";
         szLog = "- restart usługi Apache jako \""+szService+"\"";    
        endif; 
        szMsg = "Restart serwera Apache...";
      case 3: if (StrLength(szService)=0) then
         szAction = " -k install ";
         szLog = "- instalacja usługi Apache";            
        else
         szAction = " -k install -n \""+szService+"\" ";
         szLog = "- instalacja usługi Apache jako \""+szService+"\"";            
        endif; 
        szMsg = "Instalacja usługi serwera Apache...";
      case 4: if (StrLength(szService)=0) then
         szAction = " -k uninstall ";
         szLog = "- deinstalacja usługi Apache";              
        else
         szAction = " -k uninstall -n \""+szService+"\" ";
         szLog = "- deinstalacja usługi Apache jako \""+szService+"\"";              
        endif; 
        szMsg = "Deinstalacja usługi serwera Apache...";
     endswitch;
     
     if (StrLength(szService)=0) then szService = "Apache2.2"; endif;
     
     if Is(FILE_EXISTS, szPath ^ szFile) then 
      SdShowMsgWait(szMsg, nProgress, 8, TRUE); 
      if (bLog) then WriteLog(1,szLog); endif;
      if LaunchApplication(szPath ^ szFile, szAction, szPath, SW_HIDE, 0,  LAAW_OPTION_USE_SHELLEXECUTE |
     LAAW_OPTION_WAIT | LAAW_OPTION_SHOW_HOURGLASS)=ISERR_SUCCESS then
       Sleep(1000); //Tak na wszelki słuczaj
       switch (nAction) 
        //STOP//
        case 0: if ServiceExistsService(szService) then
           repeat              
            Sleep(500);
                        ServiceGetServiceState (szService, nvState );                                                                      
                  SdShowMsgWait(szMsg, nProgress, 8, TRUE);                       
                 until (nvState = SERVICE_STOPPED);                  
           if (nvState = SERVICE_STOPPED) then 
            if (bLog) then WriteLog(2,"- usługa \""+szService+"\" zatrzymana"); endif;       
            bResult = TRUE;
           endif; 
          else
           if (bLog) then WriteLog(2,"- nie można zatrzymać usługi \""+szService+"\", usługa nie jest zainstalowana w systemie!"); endif;       
           bResult = TRUE;
          endif;
        
        //START//
        case 1: if ServiceExistsService(szService) then
           repeat        
            Sleep(500);      
            ServiceGetServiceState(szService, nvState);
            SdShowMsgWait(szMsg, nProgress, 8, TRUE);                       
           until (nvState = SERVICE_RUNNING)||(nvState = SERVICE_STOPPED);                   
           if (nvState = SERVICE_RUNNING) then 
            if (bLog) then WriteLog(2,"- usługa \""+szService+"\" uruchomiona"); endif;       
            bResult = TRUE;
           endif; 
           if (nvState = SERVICE_STOPPED) then 
            if (bLog) then WriteLog(2,"- usługa \""+szService+"\" nie została uruchomiona"); endif;       
            bResult = FALSE;
           endif;
          else
           if (bLog) then WriteLog(2,"- nie można uruchomić usługi \""+szService+"\", usługa nie jest zainstalowana w systemie!"); endif;       
          endif;
          
        //INSTALL//
        case 3: if ServiceExistsService(szService) then
           if (bLog) then WriteLog(2,"- usługa \""+szService+"\" zainstalowana"); endif;       
           bResult = TRUE; 
          else
           if (bLog) then WriteLog(2,"- nie można zainstalować usługi \""+szService+"\", błąd instalacji usługi"); endif;         
          endif;    
        
        //UNINSTALL//  
        case 4: if !ServiceExistsService(szService) then
           if (bLog) then WriteLog(2,"- usługa \""+szService+"\" usunięta"); endif;       
           bResult = TRUE;  
          else
           if (bLog) then WriteLog(2,"- nie można odinstalować usługi \""+szService+"\", błąd deinstalacji usługi"); endif;          
          endif;      
          
       endswitch;
       
       
         else  
          bResult = FALSE;
          if (bLog) then WriteLog(1,"Błąd uruchomienia serwisu: \""+szPath ^ szFile+"\" parametr:\""+szAction+"\""); endif;
         endif;
         
          SdShowMsgWait(szMsg, nProgress, 8, FALSE);
         
     else  
      if bLog then WriteLog(1,"Brak pliku \""+szPath ^ szFile+"\" "); endif;
     endif;
     
     return bResult;
    end;
    
  • Instalacja usługi Apache Tomcat 6.x

    Funkcja pozwala zainstalować usługę, zatrzymać, uruchomić, zaaktualizować parametry usługi i deinstalować usługę Apache Tomcat
    Parametry:
    szPath - ścieżka zainstalowanego serwera Apache Tomcat 6.x
    nAction - 0..5 wybrana akcja dotycząca usługi
    szParams - można pominąć - future
    bLog - zapis do logu informacji
    function BOOL TomcatService(szPath, nAction, szParams, bLog)
    BOOL bResult;
    STRING szLog, szProgram, szAction;
    begin 
     switch (nAction)
      case 0: szAction = '//TS//';
        szLog = " uruchomienie usługi Tomcat jako aplikacja konsolowa";            
      case 1: szAction = '//SS//';   
        szLog = " zatrzymanie usługi Tomcat";            
      case 2: szAction = '//US//';
        szLog = " aktualizacja parametrow usługi Tomcat";                 
      case 3: szAction = '//IS//';
        szLog = " instalacja usługi Tomcat";                   
      case 4: szAction = '//DS//Tomcat6';
        szLog = " deinstalacja usługi Tomcat";                     
     endswitch;                             
     
     if Is(FILE_EXISTS, szPath ^ "tomcat6.exe") then
      szProgram = szPath ^ "tomcat6.exe";
      if LaunchApplication(szProgram, szAction, szPath, SW_HIDE, 0, LAAW_OPTION_USE_SHELLEXECUTE | 
    LAAW_OPTION_WAIT | LAAW_OPTION_SHOW_HOURGLASS)=ISERR_SUCCESS then
          bResult = TRUE;  
         else  
          bResult = FALSE;
         endif;
     else  
      if bLog then WriteLog(1,"Brak pliku \"tomcat6.exe\" "); endif;
     endif;
     
     return bResult;             
    end;

    ListaBox z włączonym lub wyłączonym stylem LBS_EXTENDEDSEL

    Przy tworzeniu okna dialogowego jest możliwość ustawienia właściwości LBS_EXTENDEDSEL,
    dzięki której możemy wybrać kilka elementów jednocześnie z listy.
    Problem pojawia się jeżeli chcemy ustawić właściwość listy dynamicznie w procesie
    inicjacji okna. Niestety nie ma możliwości zmiany stylu okna już utworzonego
    w InstallShield.
    Prostym rozwiązaniem jest utworzenie 2 obiektów ListBox z różnymi stylami
    i wyświetlanie odpowiedniej w razie potrzeby. Trudniejszym - dynamiczne
    utworzenie listy w Oknie dialogowym.