问题
I am developing a Windows desktop application which requires the SQL Server 2005 Compact Edition (SQLServerCE31-EN.msi) to be installed. I am using InstallShield 2011 to install this as a pre-requisite during the installation process.
In order to come up with the pre-requisite definition I used Process Monitor to see that these registry locations are checked when SQLServerCE31-EN.msi is run manually (not via the installer):
32-bit: HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server Compact Edition\v3.1
64-bit: HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Microsoft SQL Server Compact Edition\v3.1
Most of the time, this check seems to work and InstallShield skips the pre-requisite if it's already detected as installed. However one some machines (Windows 7 Ultimate 64-bit with SQL Server Compact Edition 3.5 already installed) the key doesn't exist, even though Microsoft SQL Server 2005 Compact Edition [ENU] is listed under Programs and Features.
There's a registry key at both of the following locations (on a 64-bit machine) which could be used to check that SQL Server Compact Edition 3.5 is installed, but nothing to show if 3.1 is installed.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v3.5
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server Compact Edition\v3.5
I am fairly certain that it is possible to have both versions installed and it's not that 3.5 upgrades 3.1, even though it is obviously a newer version.
How can I check to see if SQL Server 2005 Compact Edition is installed?
For the InstallShield users out there, this is the .prq
file we are currently using:
<?xml version="1.0" encoding="UTF-8"?>
<SetupPrereq>
<conditions>
<condition Type="1" Comparison="2" Path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v3.1" FileName="" ReturnValue="" Bits="2"></condition>
</conditions>
<files>
<file LocalFile="<ISProjectFolder>\..\InstallShieldPreRequisites\Microsoft SQL Server 2005 Compact Edition\SQLServerCE31-EN.msi" URL="http://download.microsoft.com/download/f/5/4/f54529c6-e316-4637-a211-95818fcd4451/SQLServerCE31-EN.msi" CheckSum="54854BAC91E616BF8F71184C05AD0355" FileSize="0,1819136"></file>
</files>
<execute file="SQLServerCE31-EN.msi" cmdline="/passive /norestart" cmdlinesilent="/passive /norestart" requiresmsiengine="1"></execute>
<properties Id="{51BB3FEE-3851-4ECC-909A-C9D8EAF83254}" Description="This prerequisite installs Microsoft SQL Server 2005 Compact Edition"></properties>
</SetupPrereq>
Can the prerequisite file above be improved?
回答1:
You can use product code to in HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products hive to check if SQL Server CE 3.1 is installed.
For example the product code of SQL CE 3.5 is {F0B430D1-B6AA-473D-9B06-AA3DD01FD0B8}
We will find the below in the registry:(note that the code has do some transfer) HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\1D034B0FAA6BD374B960AAD30DF10D8B
You can find the SQL CE 3.1 product code via ORCA tool. Here is the detailed steps:
Start ORCA software Open the SQL CE 3.1 msi file with ORCA Click Property and check Product Code in the right panel
Download: ORCA MSI Editor http://www.technipages.com/download-orca-msi-editor.html
Hope this helps…
回答2:
Short version of the answer:
Thanks to help from Robbie Meng at Microsoft, we have found that checking for this registry key is a reliable way of checking if the prerequisite is already installed:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\1D034B0FAA6BD374B960AAD30DF10D8B
来源:https://stackoverflow.com/questions/3969855/how-can-installshield-check-if-sql-server-2005-3-1-compact-edition-ce-is-ins