2009-08-25 6 views
21

Dokładniej chcę sprawdzić, czy Oracle ODP.Net jest zainstalowany na komputerze. Chcę to zrobić, testując klucz rejestru HKLM \ SOFTWARE \ ORACLE \ ODP.NET.W WiX jak przetestować istniejący klucz rejestru (nie wartość) dla Oracle ODP.Net

Rzeczywiste wartości używane przez ODP.Net są przechowywane w HKLM \ SOFTWARE \ ORACLE \ ODP.NET \ 2.111.6.20, ale zakładam, że nazwa klucza niższego poziomu zmieni się wraz z aktualizacją przez Oracle.

Próbowałem następujące, które zawiedzie, prawdopodobnie dlatego, że wartość (domyślna) tak naprawdę nie istnieje lub prawdopodobnie dlatego, że jest zerowy (nie jestem pewien dokładnie, jak jest reprezentowany w rejestrze).

<Property Id="ORACLE_ODPNET"> 
    <RegistrySearch Id="ODPNET_RegKey" Type="raw" Root="HKLM" Key="SOFTWARE\ORACLE\ODP.NET" Name="(Default)"/> 
</Property> 
<Condition Message="This setup requires ODP.Net to be installed."> 
    Installed OR ORACLE_ODPNET 
</Condition> 

Więc każdy z poniższych byłoby pomocne do mnie:

  • Sposób, aby wyszukać klucz rejestru bez wartości pod nią.
  • Sposób, aby wyszukać wartości rejestru przy użyciu ścieżki zawierającej symbole wieloznaczne
  • lepszy sposób przetestować ODP.NET instalowany
+0

Dzięki chłopaki! kiedyś działania własnego tak jak to tutaj opisano: [http://stackoverflow.com/a/1340107][1] [1]: http://stackoverflow.com/a/1340107 – Viktor

+0

Przy okazji, aby uzyskać wartość domyślną, należy pominąć atrybut Name. –

Odpowiedz

17

OK, więc dzięki informacjom Sascha wydaje się, że odpowiedź brzmi: "nie możesz" za pomocą wbudowanych funkcji rejestru WiX.

Teraz chciałem również, aby ten test zdarzył się wraz z innymi testami warunków uruchamiania, co czyni go nieco trudniejszym. Zabranie tego do pracy zajęło mi trochę czasu, chociaż jest to dość proste, teraz wiem jak, więc mam nadzieję, że to uratuje komuś ten sam ból.

Najpierw utworzyć właściwość wewnątrz Produktu WiX:

<Property Id="ODPNETINSTALLED">0</Property> 

Następny utworzyć działanie niestandardowe, aby sprawdzić na klucz i ustawić ODPNETINSTALLED na „1”, jeśli istnieje. Nie zamierzam tworzyć kompilacji i dodawać niestandardowej akcji do instalatora, ale jest to dość proste, jeśli używasz Votive w Visual Studio. Kod dla mojego niestandardowego działania jest:

using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Win32; 

namespace WiXCustomAction 
{ 
    public class CustomActions 
    { 
    [CustomAction] 
    public static ActionResult CheckOdpNetInstalled(Session xiSession) 
    { 
     xiSession.Log("Begin CheckOdpNetInstalled"); 

     RegistryKey lKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ORACLE\ODP.Net"); 

     xiSession["ODPNETINSTALLED"] = lKey == null ? "0" : "1"; 

     return ActionResult.Success; 
    } 
    } 
} 

Teraz trzeba się zarejestrować i zaplanować działania, ponieważ chciałem ostrzeżenie pojawiać wraz z innymi moimi warunkami nośnych musiałem dodać je do Install UI Sequence Element:

<Binary Id="WiXCustomAction.dll" SourceFile="$(var.WiXCustomAction.TargetDir)$(var.WiXCustomAction.TargetName).CA.dll" /> 
<CustomAction Id="CheckOdpNet" BinaryKey="WiXCustomAction.dll" DllEntry="CheckOdpNetInstalled" Execute="immediate" /> 
<InstallUISequence> 
    <Custom Action="CheckOdpNet" Before="LaunchConditions">NOT Installed</Custom> 
</InstallUISequence> 

Wreszcie dodać warunek uruchomienia sprawdzić właściwość:

<Condition Message="!(loc.OracleOdpCondition)"> 
    Installed OR ODPNETINSTALLED="1" 
</Condition> 

Zauważ, że wierzę, że scheduli ng w InstallUISequence oznacza, że ​​akcja niestandardowa nie zostanie uruchomiona podczas instalacji innych niż UI. Jednak mój instalator musi mieć zainstalowany interfejs, więc nie stanowi to dla mnie problemu.

6

Wystarczy pominąć RegistrySearch/@ Name, aby uzyskać „(domyślnie) "wartość. Niestety, nie ma możliwości, aby wykonać rekursywne wyszukiwanie, musisz wybrać "znany" klucz rejestru, który będzie stabilny między wydaniami i oprze się wyszukiwaniu.

<Property Id="ORACLE_ODPNET"> 
    <RegistrySearch Id="ODPNET_RegKey" Type="raw" Root="HKLM" Key="SOFTWARE\ORACLE\ODP.NET" /> 
</Property> 
<Condition Message="This setup requires ODP.Net to be installed."> 
    Installed OR ORACLE_ODPNET 
</Condition> 
+2

Tak, tak. Brak rekursywnego wyszukiwania z RegistrySearch. –

+1

Dzięki, ale czy to nie działa dla mnie, czy brakuje mi czegoś oczywistego? Jeśli spojrzę w Regedit, wartość "(domyślna)" jest normalna "(wartość nie jest ustawiona)" czy to spełni warunek WiX? BTW Używam WiX v3, jeśli to ważne. – Dan

+0

Myślę, że w takim przypadku musisz wyszukać inny klucz rejestru ... – saschabeaumont