This blog is about developing Windows applications using Visual Studio. All postings on this weblog are provided "AS IS" with no warranties, and confer no rights. Use of any samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm
Your host Nikola Dudar is a Program Manager in Windows division of Microsoft Corporation. He has been working on Windows Web Services API during Windows 7 and various additions to Visual C++ during VS2005 and VS2008. More details are in LinkedIn profile under Nikola's formal name Mykola Dudar.
If you are interested in program management and project management, check out my other blog at http://www.pmsnack.com/ where I collect best practices and other topics interesting to program and project managers.
To send feedback, comments or requests for new posts, please use the contact form.
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:
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.
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.
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\
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 http://sourceforge.net/projects/wix . More specific I am going to download from this link, http://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 :
<?define PRODUCT_ID=!!!! REPLACE WITH UUID1 FROM STEP 4 !!!! ?>
<?define PACKAGE_ID=!!!! REPLACE WITH UUID2 FROM STEP 4 !!!! ?>
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
<?include $(sys.SOURCEFILEDIR)\VCCRT.wxi ?>
Name='MSI to redistribute my app'
Language='1033' Version='126.96.36.199' Manufacturer='Me'>
Description='MSI to redistribute my app'
Comments='MSI to redistribute my app'
<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' />
<Feature Id='CRT_WinSXS' Title='CRT WinSXS' Level='1'>
<MergeRef Id='CRT' />
<MergeRef Id='CRT Policy' />
8. Now I am going back to command line, change current directory, compile and link 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.
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, http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=29&SiteID=1.
VC++ Forums, http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=29&SiteID=1.
I try to deploy my VC++ 2005 EE application (window form) in target computer as you suggest (create a msi file). However, my application using DLL files (from OpenCV). Could you pls help me in these questions:
1. If my application is window form, do I need to install .NET framework 2.0 in target computer?
2. I found the required DLL files in System32 (in developer computer). Do I need to copy them to the System 32 folder in target computer or copy it in the same folder with my exe file?
Thanks a lot bro.
This is fine if all you want to deploy is "Hello World".
What about projects that depend on 3rd party libraries/dll's? Like, OGRE, DirectX, Boost, any game engines, physics engines, etc.
MSDN suggests using the XCopy approach. It's a joke, what are we supposed to do? Run around to "everyone's" computer and set up their directory files manually?
VS Express really needs SetUp projects included with the IDE. Until then it's just a toy.
Very thorough how-to. But I don't really get the point of creating a a custom .msi out of the merge modules unless you've included your own program in the .msi that you end up with.
You might as well just distribute the vcredist_x86.exe along with your program then.
Either way the consumer has to run two installation files unless you package the two in a setup but then you will have a .msi, a setup.exe and another .msi file and a good chance that the user installs only one of them and expects the program to run.
Only reasonable answer to me is file size.
I reserve the right to become wiser
Thank you for the solution but I have some problems.. I am using VS.net 2003 so and I have VC++ 7 .
everything runs fine apart that I get an while running the light.exe due to that the file policy_8_0_Microsoft_VC80_CRT_x86.msm can't be found. I looked in the location of the merge modules and I found that I don't have such a file. Also I found that I don't have the microsoft_vc80_crt_x86.msm file as well
I have another bunch of files listed below:
What have I missed?
Installed vcredist_x86, Reinstalled NET Framework2.0.
Still no go with an application built in Visual C++ Express 2005, deployed to other computer.
"This application has failed to start because the application configuration is incorrect. Reintsalling...."
Any help? Anyone?
I have installed VC2005 installed on my machine. We have our own build scripts which uses VC8 SP1 binaries. When i run the debug executables on my machine it gives the error: "This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix the problem."
Thanks for the comprehensive example.
I have a minor issue with the msi package size. I'm trying to prepare a msi package for installing the VC80 CRT redists. The merge module size for x86 is about 630 kB, however, the msi package prepared by wix has 2 MB. There is no such problem for x64 CRT redists.
The only way I've found for reducing the msi size is setting CompressionLevel for embeded cab to none and then packing the msi with zip, rar, ... Anyone knows any better solution?
Thank you Nikola, this post saved my day. Really BIG Thank You ! ;)
This seems to be the definitive page on this topic so thanks for creating and maintaing.
1. Why aren't all of the VC6/VC7/VC7.1/VC8 C runtime DLLs installed by default in Vista? Why make the end user or developer jump through hoops to get the program to exectute?
2. Can we catch the wrong runtime error programatically and design a dialog that could point to the vcredist download page?
I am using the VS2005 and BOOST.... my application is building but i am not able to run the application b'coz of this error :-
"This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix the problem."...
can anyone help please??
This is probably simple for you chaps.
I have a VC++ program which requires the MFC and CRT dlls to run.
I compile the program using cl/clr.
I generate signed application and deployment manifests using mage.
I am trying to deploy it using ClickOnce.
I have used ClickOnce successfully in a previous version of my program which didn't need the MFC components.
My ClickOnce install fails on a clean target with an error (eg) "Cannot copy mfc90.dll - file already exists"
I believe it's because it (a) reads the microsoft.vc90.mfc manifest, and then installs the dlls' referenced in this manifest; and then (b) tries to
copy the dll's again because they are seperately defined in the ClickOnce application manifest.
If I don't include the MFC dll's (eg mfc90.dll) in the distribution folder, then the install fails because it can't find the required components of
And if I do include the dll's it tries to copy them twice and fails!
All help appreciated...
what is this?
"This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix the problem."