1

I am following the example from Wix per user installer to detect the Visual C++ 2015 Redistributable to detect VC+ 2015-2019 redistributables in per user installer, without any luck. I have checked that VC++ 2017-19 is correctly installed on my system and if I do a simple test as below, it does work.

<Property Id="CPPRUNTIME2015X86">
    <RegistrySearch Id="mfc1429x86" Root="HKCR" Key="Installer\Dependencies\VC,redist.x86,x86,14.29,bundle" Type="raw" />
</Property>
<Condition Message="Microsoft Visual C++ 2015-2019 (x86) Redistributable missing">
    <![CDATA[Installed OR CPPRUNTIME2015X86]]>
</Condition>

However, the below generic solution does not find the distributables on my system. Any idea why?

    <Property Id="CPPRUNTIME2015X86" Secure="yes">
        <!-- C++ 2015 -->
        <RegistrySearch Id="mfc140x86_23026" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\{74d0e5db-b326-4dae-a6b2-445b9de1836e}" Type="raw" />
        <RegistrySearch Id="mfc140x86_24215" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a}" Type="raw" />

        <!-- C++ 2017 -->
        <RegistrySearch Id="mfc1416x86" Root="HKCR" Key="Installer\Dependencies\VC,redist.x86,x86,14.16,bundle" Type="raw" />

        <!-- C++ 2019 -->
        <?foreach CPPRUNTIMEVERSIONPREFIX in 21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40?>
            <RegistrySearch Id="mfc14$(var.CPPRUNTIMEVERSIONPREFIX)x86" Root="HKCR" Key="Installer\Dependencies\VC,redist.x86,x86,14.$(var.CPPRUNTIMEVERSIONPREFIX),bundle" Type="raw" />
        <?endforeach ?>
    </Property>
    <Condition Message="Microsoft Visual C++ 2015-2019 (x86) Redistributable missing">
        <![CDATA[((REMOVE="ALL")) OR Installed]]>
    </Condition>
Bob Arnson
  • 21,377
  • 2
  • 40
  • 47
Jim
  • 2,760
  • 8
  • 42
  • 66

1 Answers1

2

In your working code you search for the registry entries and store the result in CPPRUNTIME2015X86. Then your Condition tests for CPPRUNTIME2015X86:

<Condition Message="Microsoft Visual C++ 2015-2019 (x86) Redistributable missing">
<![CDATA[Installed OR CPPRUNTIME2015X86]]>

In your non-working code you search for the registry entries and store the result in CPPRUNTIME2015X86. But this time your Condition does not test for CPPRUNTIME2015X86:

   <Condition Message="Microsoft Visual C++ 2015-2019 (x86) Redistributable missing">
    <![CDATA[((REMOVE="ALL")) OR Installed]]>
</Condition>

This reads to me that your checking the registry is fine, but you don't use this information.

If you use the Condition test from your working code, does it work then?

Alasdair King
  • 106
  • 1
  • 4