How to use Visual C++ .NET to detect the .NET Framework versions and service packs that are installed on the computer (914135)



The information in this article applies to:

  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.1, when used with:
    • Microsoft .NET Framework 1.1 Service Pack 1 (SP1)
  • Microsoft .NET Framework 1.0, when used with:
    • Microsoft .NET Framework 1.0 SP3
    • Microsoft .NET Framework 1.0 SP2
    • Microsoft .NET Framework 1.0 SP1
  • Microsoft Visual C++ .NET (2003)
  • Microsoft Visual C++ .NET (2002)

SUMMARY

INTRODUCTION

This article describes how to use Microsoft Visual C++ .NET to detect the Microsoft .NET Framework versions and service packs that are installed on the computer.

Requirements

The following list outlines the recommended hardware, software, network infrastructure, and service packs that you need:
  • All the operating systems that support installing the .NET Framework
  • The .NET Framework
  • The Microsoft .NET Framework 1.0 Service Pack 1 (SP1), the Microsoft .NET Framework 1.0 Service Pack 2 (SP2), the Microsoft .NET Framework 1.0 Service Pack 3 (SP3), and the Microsoft .NET Framework 1.1 Service Pack 1 (SP1) or a later service pack
  • Microsoft Visual Studio .NET
This article assumes that you are familiar with the following topics:
  • Microsoft Visual C++ .NET
  • Registry Editor

MORE INFORMATION

To detect .NET Framework versions and service packs programmatically, follow these steps:
  1. Start Visual Studio .NET.
  2. On the File menu, point to New, and then click Project.
  3. Click Visual C++ Projects under Project Types, click Console Application (.NET) on the right pane, type TestPro in the Name box, and then click OK.
  4. Replace the code in TestPro.cpp with the following code sample.
    #include "stdafx.h"
    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
    
    // The computer on which this code is compiled may not have the most recent platform SDK
    // with these values defined. In this scenario, define the values.
    #ifndef SM_TABLETPC
        #define SM_TABLETPC                     86
    #endif
    
    #ifndef SM_MEDIACENTER
        #define SM_MEDIACENTER                  87
    #endif
    
    // The following constants represent registry key names and value names
    // to use for detection.
    const TCHAR *g_szNetfx10RegKeyName          = _T("Software\\Microsoft\\.NETFramework\\Policy\\v1.0");
    const TCHAR *g_szNetfx10RegKeyValue         = _T("3705");
    const TCHAR *g_szNetfx10SPxMSIRegKeyName    = _T("Software\\Microsoft\\Active Setup\\Installed Components\\{78705f0d-e8db-4b2d-8193-982bdda15ecd}");
    const TCHAR *g_szNetfx10SPxOCMRegKeyName    = _T("Software\\Microsoft\\Active Setup\\Installed Components\\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}");
    const TCHAR *g_szNetfx10SPxRegValueName     = _T("Version");
    const TCHAR *g_szNetfx11RegKeyName          = _T("Software\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322");
    const TCHAR *g_szNetfx20RegKeyName          = _T("Software\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727");
    const TCHAR *g_szNetfx11PlusRegValueName    = _T("Install");
    const TCHAR *g_szNetfx11PlusSPxRegValueName = _T("SP");
    
    // The following items are function prototypes.
    int  GetNetfx10SPLevel();
    int  GetNetfx11SPLevel();
    int  GetNetfx20SPLevel();
    bool IsCurrentOSTabletMedCenter();
    bool IsNetfx10Installed();
    bool IsNetfx11Installed();
    bool IsNetfx20Installed();
    bool RegistryGetValue(HKEY, const TCHAR*, const TCHAR*, DWORD, LPBYTE, DWORD);
    
    /******************************************************************
    Function Name:  IsNetfx10Installed
    Description:    Uses the detection method recommended at
                    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/dotnetfxref.asp
                    to determine whether the .NET Framework 1.0 is
                    installed on the computer.
    Inputs:         NONE
    Results:        true if the .NET Framework 1.0 is installed
                    false otherwise
    ******************************************************************/
    bool IsNetfx10Installed()
    {
        TCHAR szRegValue[MAX_PATH];
        return (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10RegKeyName, g_szNetfx10RegKeyValue, NULL, (LPBYTE)szRegValue, MAX_PATH));
    }
    
    
    /******************************************************************
    Function Name:  IsNetfx11Installed
    Description:    Uses the detection method recommended at
                    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy1_1.asp
                    to determine whether the .NET Framework 1.1 is
                    installed on the computer.
    Inputs:         NONE
    Results:        true if the .NET Framework 1.1 is installed
                    false otherwise
    ******************************************************************/
    bool IsNetfx11Installed()
    {
        bool bRetValue = false;
        DWORD dwRegValue=0;
    
        if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx11RegKeyName, g_szNetfx11PlusRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
        {
            if (1 == dwRegValue)
                bRetValue = true;
        }
    
        return bRetValue;
    }
    
    
    /******************************************************************
    Function Name:  IsNetfx20Installed
    Description:    Uses the detection method recommended at
                    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy1_1.asp
                    to determine whether the .NET Framework 2.0 is
                    installed on the computer.
    Inputs:         NONE
    Results:        true if the .NET Framework 2.0 is installed
                    false otherwise
    ******************************************************************/
    bool IsNetfx20Installed()
    {
        bool bRetValue = false;
        DWORD dwRegValue=0;
    
        if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx20RegKeyName, g_szNetfx11PlusRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
        {
            if (dwRegValue == 1)
                bRetValue = true;
        }
    
        return bRetValue;
    }
    
    
    /******************************************************************
    Function Name:  GetNetfx10SPLevel
    Description:    Uses the detection method recommended at
                    http://blogs.msdn.com/astebner/archive/2004/09/14/229802.aspx
                    to determine what service pack for the
                    .NET Framework 1.0 is installed on the computer.
    Inputs:         NONE
    Results:        integer representing the service pack level for the .NET Framework 1.0
    ******************************************************************/
    int GetNetfx10SPLevel()
    {
        TCHAR szRegValue[MAX_PATH];
        TCHAR *pszSPLevel = NULL;
        int iRetValue = -1;
        bool bRegistryRetVal = false;
    
        // Determine the registry key to use to look up the service pack level
        // because it the registry key is operating system-dependent.
        if (IsCurrentOSTabletMedCenter())
            bRegistryRetVal = RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10SPxOCMRegKeyName, g_szNetfx10SPxRegValueName, NULL, (LPBYTE)szRegValue, MAX_PATH);
        else
            bRegistryRetVal = RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10SPxMSIRegKeyName, g_szNetfx10SPxRegValueName, NULL, (LPBYTE)szRegValue, MAX_PATH);
    
        if (bRegistryRetVal)
        {
            // This registry value should be in the following format:
            // #,#,#####,# 
            // Note: The last # is the service pack level.
            // Try to parse off the last # here.
            pszSPLevel = _tcsrchr(szRegValue, _T(','));
            if (NULL != pszSPLevel)
            {
                // Increment the pointer to skip the comma.
                pszSPLevel++;
    
                // Convert the remaining value to an integer.
                iRetValue = _tstoi(pszSPLevel);
            }
        }
    
        return iRetValue;
    }
    
    
    /******************************************************************
    Function Name:  GetNetfx11SPLevel
    Description:    Uses the detection method recommended at
                    http://blogs.msdn.com/astebner/archive/2004/09/14/229574.aspx
                    to determine what service pack for the 
                    .NET Framework 1.1 is installed on the computer.
    Inputs:         NONE
    Results:        integer representing service pack level for the .NET Framework 1.1
    ******************************************************************/
    int GetNetfx11SPLevel()
    {
        DWORD dwRegValue=0;
    
        if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx11RegKeyName, g_szNetfx11PlusSPxRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
        {
            return (int)dwRegValue;
        }
    
        // We only are here if the .NET Framework 1.1 is not
        // installed or if some kind of error occurred when the code retrieved
        // the data from the registry.
        return -1;
    }
    
    
    /******************************************************************
    Function Name:  GetNetfx20SPLevel
    Description:    Uses the detection method recommended at
                    http://blogs.msdn.com/astebner/archive/2004/09/14/229574.aspx
                    to determine what service pack for the 
                    .NET Framework 2.0 is installed on the computer.
    Inputs:         NONE
    Results:        integer representing the service pack level for the .NET Framework 2.0
    ******************************************************************/
    int GetNetfx20SPLevel()
    {
        DWORD dwRegValue=0;
    
        if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx20RegKeyName, g_szNetfx11PlusSPxRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
        {
            return (int)dwRegValue;
        }
    
        // We are only here if the .NET Framework 2.0 is not
        // installed or if some kind of error occurred when the code retrieved
        // the data from the registry
        return -1;
    }
    
    
    bool IsCurrentOSTabletMedCenter()
    {
    
        // Use the GetSystemMetrics function to detect if we are on a Tablet PC or a Microsoft Windows Media Center operating system.
        return ( (GetSystemMetrics(SM_TABLETPC) != 0) || (GetSystemMetrics(SM_MEDIACENTER) != 0) );
    }
    
    
    /******************************************************************
    Function Name:  RegistryGetValue
    Description:    Obtain the value of a registry key.
    Inputs:         HKEY hk - The hk of the key to retrieve
                    TCHAR *pszKey - Name of the key to retrieve
                    TCHAR *pszValue - The value that will be retrieved
                    DWORD dwType - The type of the value that will be retrieved
                    LPBYTE data - A buffer to save the retrieved data
                    DWORD dwSize - The size of the data retrieved
    Results:        true if it is successful, false otherwise
    ******************************************************************/
    bool RegistryGetValue(HKEY hk, const TCHAR * pszKey, const TCHAR * pszValue, DWORD dwType, LPBYTE data, DWORD dwSize)
    {
        HKEY hkOpened;
    
        // Try to open the key.
        if (RegOpenKeyEx(hk, pszKey, 0, KEY_READ, &hkOpened) != ERROR_SUCCESS)
        {
            return false;
        }
    
        // If the key was opened, try to retrieve the value.
        if (RegQueryValueEx(hkOpened, pszValue, 0, &dwType, (LPBYTE)data, &dwSize) != ERROR_SUCCESS)
        {
            RegCloseKey(hkOpened);
            return false;
        }
    
        // Clean up.
        RegCloseKey(hkOpened);
    
        return true;
    }
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                           HINSTANCE hPrevInstance,
                           LPTSTR    lpCmdLine,
                           int       nCmdShow)
    {
        int iNetfx10SPLevel = -1;
        int iNetfx11SPLevel = -1;
        int iNetfx20SPLevel = -1;
        TCHAR szMessage[MAX_PATH];
    
        // Determine whether the .NET Framework
        // 1.0, 1.1, or 2.0 is installed.
        bool bNetfx10Installed = IsNetfx10Installed();
        bool bNetfx11Installed = IsNetfx11Installed();
        bool bNetfx20Installed = IsNetfx20Installed();
    
        // If the .NET Framework 1.0 is installed, obtain the
        // service pack level.
        if (bNetfx10Installed)
        {
            iNetfx10SPLevel = GetNetfx10SPLevel();
    
            if (iNetfx10SPLevel > 0)
                _stprintf(szMessage, _T("The .NET Framework 1.0 Service Pack %i is installed."), iNetfx10SPLevel);
            else
                _stprintf(szMessage, _T("The .NET Framework 1.0 is installed without service packs."));
    
            MessageBox(NULL, szMessage, _T("The .NET Framework 1.0"), MB_OK | MB_ICONINFORMATION);
        }
        else
        {
            MessageBox(NULL, _T("The .NET Framework 1.0 is not installed."), _T(".NET Framework 1.0"), MB_OK | MB_ICONINFORMATION);
        }
    
        // If the .NET Framework 1.1 is installed, obtain the
        // service pack level.
        if (bNetfx11Installed)
        {
            iNetfx11SPLevel = GetNetfx11SPLevel();
    
            if (iNetfx11SPLevel > 0)
                _stprintf(szMessage, _T("The .NET Framework 1.1 Service Pack %i is installed."), iNetfx11SPLevel);
            else
                _stprintf(szMessage, _T("The .NET Framework 1.1 is installed without service packs."));
    
            MessageBox(NULL, szMessage, _T("The .NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
        }
        else
        {
            MessageBox(NULL, _T("The .NET Framework 1.1 is not installed."), _T("The .NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
        }
    
        // If the .NET Framework 2.0 is installed, obtain the
        // service pack level.
        if (bNetfx20Installed)
        {
            iNetfx20SPLevel = GetNetfx20SPLevel();
    
            if (iNetfx20SPLevel > 0)
                _stprintf(szMessage, _T("The .NET Framework 2.0 Service Pack %i is installed."), iNetfx11SPLevel);
            else
                _stprintf(szMessage, _T("The .NET Framework 2.0 is installed without service packs."));
    
            MessageBox(NULL, szMessage, _T("The .NET Framework 2.0"), MB_OK | MB_ICONINFORMATION);
        }
        else
        {
            MessageBox(NULL, _T("The .NET Framework 2.0 is not installed."), _T("The .NET Framework 2.0"), MB_OK | MB_ICONINFORMATION);
        }
    
        return 0;
    }

REFERENCES

For more information, click the following article number to view the article in the Microsoft Knowledge Base:

318785 How to determine which versions of the .NET Framework are installed and whether service packs have been applied


Modification Type:MinorLast Reviewed:4/21/2006
Keywords:kbPubTypeKC kbcode kbhowto KB914135 kbAudDeveloper