Poprzedni | Spis treści | Następny

Dodatek C: Użyteczne Skrypty


C.1 Pobieranie katalogu nadrzędnego

 ; GetParent
 ; wejście, góra stosu (np. C:\Program Files\Poop)
 ; wyjście, góra stosu (zamienia, z np. C:\Program Files)
 ; nie modyfikuje innych zmiennych.
 ;
 ; Użycie:
 ;   Push "C:\Program Files\Directory\Whatever"
 ;   Call GetParent
 ;   Pop $R0
 ;   tutaj $R0 będzie równy "C:\Program Files\Directory"

 Function GetParent

   Exch $R0
   Push $R1
   Push $R2
   Push $R3

   StrCpy $R1 0
   StrLen $R2 $R0

   loop:
     IntOp $R1 $R1 + 1
     IntCmp $R1 $R2 get 0 get
     StrCpy $R3 $R0 1 -$R1
     StrCmp $R3 "\" get
     Goto loop

   get:
     StrCpy $R0 $R0 -$R1

     Pop $R3
     Pop $R2
     Pop $R1
     Exch $R0

 FunctionEnd

C.2 Obcinanie nowych lini

 ; TrimNewlines
 ; wejście, góra stosu  (np. whatever$\r$\n)
 ; wyjście, góra stosu (zamienia, z np. whatever)
 ; nie modyfikuje innych zmiennych.

 Function TrimNewlines
   Exch $R0
   Push $R1
   Push $R2
   StrCpy $R1 0

 loop:
   IntOp $R1 $R1 - 1
   StrCpy $R2 $R0 1 $R1
   StrCmp $R2 "$\r" loop
   StrCmp $R2 "$\n" loop
   IntOp $R1 $R1 + 1
   IntCmp $R1 0 no_trim_needed
   StrCpy $R0 $R0 $R1

 no_trim_needed:
   Pop $R2
   Pop $R1
   Exch $R0
 FunctionEnd

C.3 Pobieranie parametrów lini poleceń

 ; GetParameters
 ; wejście, brak
 ; wyjście, góra stosu (zamienia, z np. whatever)
 ; nie modyfikuje innych zmiennych.

 Function GetParameters

   Push $R0
   Push $R1
   Push $R2
   Push $R3

   StrCpy $R2 1
   StrLen $R3 $CMDLINE

   ;Sprawdza czy istnieją znaki cudzysłowia lub spacje
   StrCpy $R0 $CMDLINE $R2
   StrCmp $R0 '"' 0 +3
     StrCpy $R1 '"'
     Goto loop
   StrCpy $R1 " "

   loop:
     IntOp $R2 $R2 + 1
     StrCpy $R0 $CMDLINE 1 $R2
     StrCmp $R0 $R1 get
     StrCmp $R2 $R3 get
     Goto loop

   get:
     IntOp $R2 $R2 + 1
     StrCpy $R0 $CMDLINE 1 $R2
     StrCmp $R0 " " get
     StrCpy $R0 $CMDLINE "" $R2

   Pop $R3
   Pop $R2
   Pop $R1
   Exch $R0

 FunctionEnd

C.4 Wyszukiwanie w łańcuchu znaków

 ; StrStr
 ; wejście, góra stosu = łańcuch znakowy do wyszukania
 ;        góra stosu-1 = łańcuch znakowy, w którym wyszukujemy
 ; wyjście, góra stosu (zamienia pozostałą część łańcucha znakowego)
 ; nie modyfikuje innych zmiennych.
 ;
 ; Użycie:
 ;   Push "to jest dlugi napis"
 ;   Push "dlugi"
 ;   Call StrStr
 ;   Pop $R0
 ;  (tutaj $R0 jest "dlugi napis")

 Function StrStr
   Exch $R1 ; st=haystack,old$R1, $R1=needle
   Exch     ; st=old$R1,haystack
   Exch $R2 ; st=old$R1,old$R2, $R2=haystack
   Push $R3
   Push $R4
   Push $R5
   StrLen $R3 $R1
   StrCpy $R4 0
   
   ; $R1=needle
   ; $R2=haystack
   ; $R3=len(needle)
   ; $R4=cnt
   ; $R5=tmp
   
   loop:
     StrCpy $R5 $R2 $R3 $R4
     StrCmp $R5 $R1 done
     StrCmp $R5 "" done
     IntOp $R4 $R4 + 1
     Goto loop
 done:
   StrCpy $R1 $R2 "" $R4
   Pop $R5
   Pop $R4
   Pop $R3
   Pop $R2
   Exch $R1
 FunctionEnd

C.5 Pobieranie wersji Windows


 ; GetWindowsVersion
 ;
 ; Oparty na funkcji Yazno, http://yazno.tripod.com/powerpimpit/
 ; Uaktualniony przez Joost Verburg
 ;
 ; Zwraca na górze stosu
 ;
 ; Wersja Windows (95, 98, ME, NT x.x, 2000, XP, 2003, Vista)
 ; lub
 ; '' (Nieznana Wersja Windows)
 ;
 ; Użycie:
 ;   Call GetWindowsVersion
 ;   Pop $R0
 ;   tutaj $R0 jest "NT 4.0" lub inne

 Function GetWindowsVersion

   Push $R0
   Push $R1

   ClearErrors

   ReadRegStr $R0 HKLM \
   "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion

   IfErrors 0 lbl_winnt

   ; nie NT
   ReadRegStr $R0 HKLM \
   "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber

   StrCpy $R1 $R0 1
   StrCmp $R1 '4' 0 lbl_error

   StrCpy $R1 $R0 3

   StrCmp $R1 '4.0' lbl_win32_95
   StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98

   lbl_win32_95:
     StrCpy $R0 '95'
   Goto lbl_done

   lbl_win32_98:
     StrCpy $R0 '98'
   Goto lbl_done

   lbl_win32_ME:
     StrCpy $R0 'ME'
   Goto lbl_done

   lbl_winnt:

   StrCpy $R1 $R0 1

   StrCmp $R1 '3' lbl_winnt_x
   StrCmp $R1 '4' lbl_winnt_x

   StrCpy $R1 $R0 3

   StrCmp $R1 '5.0' lbl_winnt_2000
   StrCmp $R1 '5.1' lbl_winnt_XP
   StrCmp $R1 '5.2' lbl_winnt_2003
   StrCmp $R1 '6.0' lbl_winnt_vista lbl_error

   lbl_winnt_x:
     StrCpy $R0 "NT $R0" 6
   Goto lbl_done

   lbl_winnt_2000:
     Strcpy $R0 '2000'
   Goto lbl_done

   lbl_winnt_XP:
     Strcpy $R0 'XP'
   Goto lbl_done

   lbl_winnt_2003:
     Strcpy $R0 '2003'
   Goto lbl_done

   lbl_winnt_vista:
     Strcpy $R0 'Vista'
   Goto lbl_done

   lbl_error:
     Strcpy $R0 ''
   lbl_done:

   Pop $R1
   Exch $R0

 FunctionEnd

C.6 Pobieranie wersji Internet Explorera


; GetIEVersion
 ;
 ; Oparty na funkcji Yazno, http://yazno.tripod.com/powerpimpit/
 ; Zwraca na górze stosu
 ; 1-6 (Zainstalowana wersja IE)
 ; lub
 ; '' (IE nie jest zainstalowany)
 ;
 ; Użycie:
 ;   Call GetIEVersion
 ;   Pop $R0
 ;   tutaj $R0 jest "5" lub inne

 Function GetIEVersion
 Push $R0
   ClearErrors
   ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "Version"
   IfErrors lbl_123 lbl_456

   lbl_456: ; ie 4+
     Strcpy $R0 $R0 1
   Goto lbl_done

   lbl_123: ; starsza wersja ie
     ClearErrors
     ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "IVer"
     IfErrors lbl_error

       StrCpy $R0 $R0 3
       StrCmp $R0 '100' lbl_ie1
       StrCmp $R0 '101' lbl_ie2
       StrCmp $R0 '102' lbl_ie2

       StrCpy $R0 '3' ; domyślnie w ie3, jeśli nie 100, 101, lub 102.
       Goto lbl_done
         lbl_ie1:
           StrCpy $R0 '1'
         Goto lbl_done
         lbl_ie2:
           StrCpy $R0 '2'
         Goto lbl_done
     lbl_error:
       StrCpy $R0 ''
   lbl_done:
   Exch $R0
 FunctionEnd

C.7 Sprawdzanie czy zainstalowany Microsoft .NET Framework


; IsDotNETInstalled
 ;
 ; Oparty na GetDotNETVersion
 ;   http://nsis.sourceforge.net/Get_.NET_Version
 ;
 ; Użycie:
 ;   Call IsDotNETInstalled
 ;   Pop $0
 ;   StrCmp $0 1 found.NETFramework no.NETFramework

 Function IsDotNETInstalled
   Push $0
   Push $1

   StrCpy $0 1
   System::Call "mscoree::GetCORVersion(w, i ${NSIS_MAX_STRLEN}, *i) i .r1"
   StrCmp $1 0 +2
     StrCpy $0 0

   Pop $1
   Exch $0
 FunctionEnd

C.8 Sprawdzanie czy zainstalowany Odtwarzacz Macromedia Flash


 ; IsFlashInstalled
 ;
 ; Napisał Yazno, http://yazno.tripod.com/powerpimpit/
 ; Zwraca na górze stosu
 ; 0 (Flash nie jest zainstalowany)
 ; lub
 ; 1 (Flash jest zainstalowany)
 ;
 ; Użycie:
 ;   Call IsFlashInstalled
 ;   Pop $R0
 ;   $R0 tutaj jest "1" lub "0"

 Function IsFlashInstalled
  Push $R0
  ClearErrors
  ReadRegStr $R0 HKCR "CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}" ""
  IfErrors lbl_na
    StrCpy $R0 1
  Goto lbl_end
  lbl_na:
    StrCpy $R0 0
  lbl_end:
  Exch $R0
 FunctionEnd

C.9 Łączenie z Internetem


 ; ConnectInternet (używa wtyczki Dialer)
 ; Napisał Joost Verburg
 ;
 ; Funkcja ta próbuje utworzyć połączenie z internetem, jeśli nie jest dostępne żadne połączenie.
 ; Jeśli nie jesteś pewien czy system, na którym uruchomiono instalatora ma aktywne połączenie
 ; z internetem, wywołaj tę funkcję przed pobieraniem plików przez wtyczkę NSISdl.
 ;
 ; Funkcja wymaga Internet Explorera 3, lecz pyta o ręczne połączenie, jeśli nie jest on zainstalowany.

 Function ConnectInternet

   Push $R0

     ClearErrors
     Dialer::AttemptConnect
     IfErrors noie3

     Pop $R0
     StrCmp $R0 "online" connected
       MessageBox MB_OK|MB_ICONSTOP "Błąd połączenia z internetem."
       Quit ;Zamyka instalatora. Możesz dodać własną obsługę błędów.

     noie3:

     ; IE3 nie zainstalowany
     MessageBox MB_OK|MB_ICONINFORMATION "Proszę, połącz się teraz z internetem."

     connected:

   Pop $R0

 FunctionEnd

C.10 Pobieranie Nazwy Instalatora

System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
 ;zmienna $R0 będzie zawierała nazwę instalatora

C.11 Zapobieganie Uruchamiania Wielu Kopii Instalatora

Wstaw poniższy fragment kodu do funkcji .onInit:

 System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'
 Pop $R0

 StrCmp $R0 0 +3
   MessageBox MB_OK|MB_ICONEXCLAMATION "Instalator jest już uruchomiony."
   Abort

'myMutex' powinien być zastąpiony dowolną unikalną wartością.


C.12 Więcej

Więcej użytecznych skryptów możesze znaleźć w NSIS Wiki, na forum NSIS oraz na stronie NSIS.


Poprzedni | Spis treści | Następny

Ostatnia aktualizacja strony: Niedziela, 6 Września 2009 (16:05:21)
Copyright © 2002 - 2010 by Paweł Porwisz. Wszelkie prawa zastrzeżone.
Strona wygenerowana w 0.001s. Hosted by tox.pl
[Valid XHTML] [Valid CSS] [Valid RSS] [Opera] [BrowseHappy]