Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deploy a Win32 API application as an executable

Tags:

exe

winapi

How can I deploy my Win32 application as an EXE application so that others (who don't have VC++ installed) can use it?

I am using VC++ 2010 on Windows 7.

like image 380
Apoorv Avatar asked Feb 16 '23 18:02

Apoorv


1 Answers

If you switch to "Release" mode when you compile your finished program (rather than "Debug", which you use for debugging it during development), you should get an executable that will run on a computer without Visual Studio installed.

However, that executable will still require the appropriate version of the C runtime library to be installed. For example, if you developed it in Visual C++ 2010, you will need version 10 of the CRT installed. This is a freely redistributable library, downloadable here.

So, you have several options for deployment:

  1. Manual Deployment

    Give people the bare executable file, and include the installer for the redistributable in another folder on the installation media. If they copy the executable to disk and cannot run it because they get an error message, they should install the CRT libraries from the included redistributable installer. Then the executable will run just fine.

    This works great if you have relatively a computer-savvy audience, or you're deploying to a fixed range of machines (like across a school or corporation). But it doesn't work so well for general deployment to customers.

    In fact, you don't even need the installer. You can just place the CRT DLLs in the same folder as your executable and it will run just fine. This is how I test apps I'm developing on clean VMs. It works like a charm. There's no need to run the CRT installer at all. You'll find these required libraries as part of your Visual Studio installation:

    <Program Files folder>\Microsoft Visual Studio 10.0\VC\redist\x86
    
  2. Automated Deployment

    Create a setup program that automatically installs your application along with any dependencies it requires, including the CRT redistributable. This is what you see most commercial applications doing. I recommend it for anything but the most trivial of apps.

    Full versions of Visual Studio 2010 (i.e., not Express versions) can create a Setup Project that you can customize as needed to work as an installer for your application. But this is no longer the recommended way to create an installer, and this functionality has been removed from the latest version of Visual Studio, 2012.

    So I recommend using something else, even if you have an older version of VS where the Setup Project is available. No point in wasting time creating something you'll just have to update later. My personal favorite choices for creating setup programs are WiX and Inno Setup. Both are free, and extensive documentation is available online.

    Creating simple setups that don't have to do very much is really quite straightforward—this is likely the case for you, as all you need to do is install the CRT redistributable if it is not already there. I'd be willing to bet money you can find a walkthrough or example online for how to do this in either WiX or Inno Setup.

    If you need to do more complicated stuff, both of these setup packages support it. They are extensively customizable and very powerful, it just takes more work to get it all going.

  3. Static Linking

    If you absolutely need to be able to distribute a bare executable that is guaranteed to simply work when double-clicked, you will need to switch your project to statically link in the required runtime libraries. This means that all of the CRT code is actually embedded by the linker directly into your executable, and means that you don't have to redistribute the CRT libraries separately.

    The disadvantage of this approach is that the only way to benefit from improvements, bug fixes, and security patches released for the CRT is to recompile and redistribute your application. If you dynamically link (the default), your app will automatically benefit from enhancements to the installed version of the CRT libraries. Microsoft strongly recommends against static linking.

    To switch between these modes in Visual Studio, follow these steps:

    • Right-click on your project in the Solution Explorer and select "Properties".
    • Ensure that the "Release" configuration is selected in the drop-down box at the top of the dialog.
    • Expand the "C/C++" item in the TreeView, and select "Code Generation".
    • Change the setting of the "Runtime Library" option to "Multi-threaded (/MT)".

    A further description on what these cryptic compiler switches mean and which ones you should use when is given in my answer here.

Final Note: The "Debug" versions of the CRT libraries are not redistributable, but that doesn't matter because you should always distribute the "Release" build of your app anyway, never the "Debug" build.

like image 200
Cody Gray Avatar answered Feb 20 '23 02:02

Cody Gray