Running C++ application built by VC++ Express on another computer

Another FAQ from VC++ Express users is: "I give my VC++ application to my friend, and it does not run on her computer." This happens because VC++ Dlls have to be redistributed to another computer together with this application.

 

There are three ways to get an application built with VC++ Express 2005 to run on another computer that does not have VC++ Express installed:

  1. Ask user of that computer to install  Visual C++ Redistributable Package (VCRedist_x86.exe) to install all Visual C++ libraries as shared side-by-side assemblies into the native assembly cache (WinSxS folder). This package can be downloaded from the Microsoft download site Microsoft Visual C++ 2005 Redistributable Package (x86). Redistributing Visual C++ libraries using this package is recommended for applications built with Visual C++ Express.

  2. Build another installer of VC++ libraries using Redistributable Merge Modules installed by VC++ Express into Common Files\Merge Modules. I am describing this approach below in more details.

  3. Statically link your application to VC++ libraries.  I recommend against statically linking because static linking prevents your application from running against the most up todate version of VC++ libraries installed on your computer. For example, consider an application that is statically linked to a particular library, running on a client computer with a new version of this library. The application still uses code from the previous version of this library, and does not benefit from library improvements, such as security enhancements.

So if you have decided that you cannot use  Microsoft Visual C++ 2005 Redistributable Package (x86) and wisely avoid statically linking to VC++ libraries, you may build a custom MSI that deployes VC++ libraries using  four merge modules with CRT library installed by VC++ Express. In my case there are installed in D:\Program Files\Common Files\Merge Modules\:

D:\Program Files\Common Files\Merge Modules\

microsoft_vc80_crt_x86.msm

policy_8_0_microsoft_vc80_crt_x86.msm

microsoft_vc80_debugcrt_x86.msm

policy_8_0_microsoft_vc80_debugcrt_x86.msm

Clearly I assume that you have read the EULA and redist.txt and do understand that redistribution of debug applications is not allowed. You can simulate redist of debug binaries in your office, but if it goes outside to another computer, it must be application build in Release mode. So please read the EULA and redist.txt carefully and understand what you can and what you cannot redistribute.

I am going to show now how to one can use MSMs to install VC++ DLLs to another computer. I have VC++ Express installed on my computer and I want to make it run on another computer that does not have VC++2005 installed. Here is what I do:

   1. I download WIX from sourceforge.net, here is the link https://sourceforge.net/projects/wix . More specific I am going to download from this link, https://prdownloads.sourceforge.net/wix/binaries-2.0.3220.0.zip?download but you may use another build of WiX, perhaps more recent or older then one I use.

   2. I am going to unzip this package to D:\WiX\

   3.Now I am going to open Visual Studio 2005 Command Prompt (Start>All Programs>Visual C++ 2005 Express Edition>Visual Studio Tools>Visual Studio 2005 Command Prompt)

   4. I am typing uuidgen –n2 and click Enter. This generates two UUIDs for me that I am going to use later in Step 6.

   5. Now I am going to create two XML files in D:\WiX. First VCCRT.wxi, second VCCRT.wxs.

   6. First, I am creating D:\WIX\VCCRT.wxi with the following content :

<Include>

            <?define PRODUCT_ID=!!!! REPLACE WITH UUID1 FROM STEP 4 !!!! ?>

            <?define PACKAGE_ID=!!!! REPLACE WITH UUID2 FROM STEP 4 !!!! ?>

</Include>

Attn: I am going to use two UUIDs generated for me by uuiedgen.exe in the Step 4 to define PRODUCT_ID and PACKAGE_ID. On purpose, I am not listing UUID generated for me, so to help readers of this article avoid using same UUID as someone else.

   7. Second, I am creating D:\WIX\VCCRT.wxs with following content

<?xml version='1.0'?>

<?include $(sys.SOURCEFILEDIR)\VCCRT.wxi ?>

<Wix xmlns='https://schemas.microsoft.com/wix/2003/01/wi'>

   <Product Id='$(var.PRODUCT_ID)'

                                    Name='MSI to redistribute my app'

                                    Language='1033' Version='1.0.0.0' Manufacturer='Me'>

            <Package Id='$(var.PACKAGE_ID)'

                        Description='MSI to redistribute my app'

                        Comments='MSI to redistribute my app'

                        Manufacturer='Me'

                        InstallerVersion='300'

                        Compressed='yes' />

            <Media Id='1' Cabinet='VCCRT.cab' EmbedCab='yes' />

            <Directory Id='TARGETDIR' Name='SourceDir'>

  <Merge Id='CRT' Language='0' src='D:\Program Files\Common Files\Merge Modules\microsoft_vc80_crt_x86.msm' DiskId='1' />

  <Merge Id='CRT Policy' Language='0' src='d:\Program Files\Common Files\Merge Modules\policy_8_0_Microsoft_VC80_CRT_x86.msm' DiskId='1' />

            </Directory>

  <Feature Id='CRT_WinSXS' Title='CRT WinSXS' Level='1'>

                        <MergeRef Id='CRT' />

                        <MergeRef Id='CRT Policy' />

            </Feature>

            <InstallExecuteSequence>

                        <RemoveRegistryValues/>

                        <RemoveFiles/>

                        <InstallFiles/>

                        <WriteRegistryValues/>

            </InstallExecuteSequence>

   </Product>

</Wix>

   8. Now I am going back to command line, change current directory, compile and link msi

  1. >cd d:\WiX
  2. >candle.exe vccrt.wxs -out vccrt.wixobj
  3. >light.exe vccrt.wixobj -out vccrt.msi

   9. That's it, MSI is created. It should be a file D:\WiX\vccrt.msi. If you see errors, take a look on troubleshooting section below.

   10.  Now I copy my application and vccrt.msi to another computer where I want this application to run which does not have VC++ Express installed. After I have copied my EXE and vccrt.msi, I will first run vccrt.msi before running my EXE.

   11. Well my application works just fine. If your application does not start after MSI is installed, please see TroubleShoting section below.

Troubleshooting:

1. Error message CNDL0054 from candle.exe

candle.exe : error CNDL0054 : The document element name 'Include' is invalid. A WiX source file must use 'Wix' as the document element name.

Cause: you have tried executing >candle.exe vccrt.wxi -out vccrt.wixobj instead of >candle.exe vccrt.wxs -out vccrt.wixobj

2. Error message CNDL0009 from candle.exe

D:\WiX\vccrt.wxs(6) : error CNDL0009 : The Product/@Id attribute's value, '!!!! REPLACE WITH UUID FROM STEP 4 !!!! ', is not a legal guid value.

D:\WiX\vccrt.wxs(10) : error CNDL0009 : The Package/@Id attribute's value, '!!!! REPLACE WITH UUID FROM STEP 4 !!!!', is not a legal guid value.

Cause: Edit vccrt.wxi and replace !!!! REPLACE WITH UUID FROM STEP 4 !!!! with UUID generated in Step 4

3. Error Message CNDLXXXX from candle.exe

 

Cause: No idea, mistake happen when you copy/pasted XML from this post. See WiX documentation for troubleshooting.

 

4. Error on start of application either a message box that says "This application has failed to start because the application configuration is incorrect" or "The system cannot execute the specified program"

Cause: First, check that your application is built in Release mode. If it was Debug application, you will see OS errors that let you know that either msvcm80d.dll or msvcr80d.dll is not loaded. Second, check if you have deployed all Dependencies of this application. Use depends.exe to see dependencies of an application

5. Error message box while starting your application that says "To run this application you first must install .Net Framework of version v.2.0.xxxx".

Cause: You application contains managed code and depends on presence of .Net Framework. For C++ applications it means that it has been compiled as /clr, /clr:pure or /clr:safe. You have install .Net Framework.

6. After you have installed MSI and you run your application you still get errors described on this page in MSDN , please make sure you have done all steps exactly as they are described and repeat them. Also check out general troubleshooting section in MSDN docs for issues around deployment of Visual C++ libraries.

 

For any additional help with redistributing applications built with VC++ Express, please check out discussions or ask your question on 

VC++ Forums, https://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=29&SiteID=1.