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='188.8.131.52' 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.
What is this utter nonsense?
“Clearly I assume that you have read the EULA and redist.txt and do understand that redistribution of debug applications is not allowed. “
I need, or actually I'm required by our clients, to distribute full debug builds of all our products to our clients end user test and quality control groups. We may be talking about several hundred installations for some of our clients.
So what your actually saying is that VC 8 is completely out of the question as a development tool for us and the occasional developer at the client site?
Neither EULA for any version of Visual Studio allows you to redistribute debug versions of VC++ libraries. It was never legal and it is not a new policy in VC8. If you would like to discuss your situation, you are welcome to contact me offline using my email nikolad at microsoft dot com.
PingBack from http://mahtar.net/?p=32
First thing, Nikola, thanks for the solution.
I was really surprised when i got error trying to run my application written in VC++ 2005 Express on machine without VC++. I thought, "Ok, we need to install .NET Framework 2.0 " but when i saw it is installed I was even more surprised! After searching internet i found it wasn't only my problem. I found 2 solutions that worked for me but i still think the whole problem it's a some kind of misunderstanding! Why do I have to redistribute some other files with my executable when the whole point of .NET Framework is to keep all the components and libraries inside it, or am I wrong?
I think the best solution would be to in this case to embeded needed libraries in executable, it's obvious way of thinking considering I have to redistribute those files with my application anyway.
So here's my question. Is it possible to comile .exe file with emeded libraries needed to run it other machine in VC++ 2005 Express?
Here are some quick answers to your questions.
> Why do I have to redistribute some other files with my executable when the whole point of .NET Framework is to keep all the components and libraries inside it, or am I wrong?
VC++ libraries are built in native code primarily (CRT, MFC, ATL, etc). Except CRT and SCL, they are not part of .Net Framework for that reason. However several components out of libraries are built in managed code. Such CRT and SCL are used by managed code written in C++ and they are included in .Net Framework because of parts of .Net FX use C++. If you only use CRT and Std. C++ Library, you can only redistribute .Net Framework.
> Is it possible to compile .exe file with embeded libraries needed to run it other machine in VC++ 2005 Express?
This is static linking of libraries. Check documentation for /MT[d] switch and topics on static linking of MFC and CRT libraries.
Static linking is not recommended in general case and should be avoided when possible. More on this here http://msdn2.microsoft.com/en-us/library/ms235316(VS.80).aspx
I am getting the following error after step 8c:
C:\WIX\VCCRT.wxs(29) : fatal error LGHT0034: Cannot open merge module 'CRT' at path 'D:\Program Files\Common Files\Merge Modules
I'm sure this is because the drive letter the WIX folder is in is C: not D:. How can i fix this? This seems to be the only problem.
You need to find where MSMs are installed on your computer. It may be C: or D: or any other drive. In my case, they were installed in D:\Program Files\Common Files\Merge Modules\. There are four merge modules with CRT library installed by VC++ Express listed below:
So, how exactly are we supposed to distribute applications developed with VC++ Express?
The very fact that we have to go through all of this contorted nonsense to create something that will run on another PC makes me believe that Microsoft never really intended us to distribute VC++ Express applications. If they had wanted us to distribute VC++ Express applications, they would have provided us with a tool to make a quick-and-easy deployment package.
I really can't believe that the approach outlined here is the only way to distribute a ".exe" file.
Please tell me I'm missing something here.
With VC++ Express there are two options:
A) Using VCRedist.EXE that can be downloaded from MSDN site. More details in another post, http://blogs.msdn.com/nikolad/archive/2006/04/11/Download-location-for-VCRedist.aspx
A) Using MSMs, as I described in this post.
There are more information on deployment in MSDN, http://msdn2.microsoft.com/en-us/library/ms235299(VS.80).aspx and there are topics about this on forums, http://forums.microsoft.com/msdn/ShowForum.aspx?ForumID=29.
I'm trying to migrate my Win32 apps (c++ using only Win32 API), from Visual Studio 6.0 and Visual Studio 2003 to Visual Studio 2005 Pro. But unfortunately the apps get linked with Msvcr80.dll. I solved this setting in project settings-> C/C++-> Code Generation-> Runtime Library to "Multi-Threaded (/MT). But the apps size are to big. I can't deploy the Visual Studio 5 Libraries cause the apps are installed in thousands of workstations with all kind of Windows versions (95 to 2003). Is there any other option, that I can set to lose the dlls dependency?
Thanks in advance
I am glad to hear that you are migrating your application to VS2005. It is true that if you build application with VS2005, you at least get dependency on VC++ CRT library (msvcr80.dll). You may deploy VC++ libraries on other computers using MSMs, VCRedist.EXE or DLLs+manifest in applocal folder. These options are described in details here: < http://msdn2.microsoft.com/en-us/library/ms235299(VS.80).aspx >
[Rant] First of all -- I'm sorry you seem to be so happy to gloss over the removal of the ability to compile Hello World and copy to another computer and expect it to run. I realise VSE is a free product, but I don't think this is a trivial issue, and I can't believe it isn't addressed as a standard part of the distribution. Take a step back and compare it with other compiler vendors for example. If they gave the answer you have above I'd bin their product instantly (even if it was free -- and many are). Bring back Visual C++ 6! [/Rant] Sorry I know it's not really your responsibility. I just had to vent.
Is it possible to link with static copies of the standard libraries instead? I would much prefer it in light of some of the problems (not least the quality of the error messages). Or would I be forced to switch to a different compiler to do that?
PS: Can you at least publish generic .msi files to save us going through the 11 point plan you proposed?
Requirement to redistribute VC++ DLLs is not to VS2005. Even with VC6 you need to redistribute VC++ Dlls on another computer. It just happens that Windows team has also been using VC6 versions of VC++ Dlls when XP was built and they have installed that version of libraries on every computer with Windows. However this is not the same version of CRT you have on your developer machine installed by VS6. Windows continue maintaining that version of CRT, ATL and MFC which is VC6 based but contains long list of changes never released in VC6. If you run your application on these versions of DLLs, behavior of your application may be different from what you expect and what you have tested with VC6 DLLs. To conclude, you always have to redistribute VC++ DLLs with which you have tested your application, no matter this is VC6, VC7, VC71 or VC8.
Yes, you can statically link and there is VCRedist package that can be downloaded from the web. Please see MSDN for more information.
I am developing C++ applications with VS 2005 Express and Pro. I've also had the deployment-to-another-computer problem. I understand you can solve this
a) by static linking (not good for many reasons)
b) by installing the VCredist_x86.exe package (ok but sometimes it's inconvenient to force users to install this first and then install one's product)
c) by creating the MSI installer
Now about point c). You describe a rather involved procedure to do that, which includes using some third-party tools (WiX), some manual editing, etc. My question is: isn't it possible to automate this procedure _completely_ from the VS environment? I.e. that instead of an .exe, VS would produce the .msi file? If not, could you explain the reasons behind having this complex deployment procedure which actually involves third-party tools instead of having it in some way automated from VS?
VCRedist package and SP1 is "The Next Generation of DLL Hell". I am glad to work with the _RTM define, because I have to internal release today. (mad)