Introduction
While short on time and after a long search for a way to get Microsoft Office application information, all or specific (i.e., Word, Excel, Access etc.), I found a few great articles here on Codeproject and translated from C# / combined them to procure the data I needed. Although I am not the author of the code, I did manage to make it work for my particular case. There are several other ways to go about this and this by no means is the best or only way.
Also, there are many directions you can take this, many changes, additions to be made, output to a grid, faster, more efficient, etc. Hopefully, this will help anyone who is lost or is having a difficult time finding help on doing something similar.
Background
This is my first article here on Codeproject and the basis for this comes from an article from Warren Stevens titled Microsoft Office Version Detector.
Full credit for this goes to Warren Stevens and Daneil Leykauf in the article and comments found in this article and to Niskof for his article.
Again, this is not my original work but I found these articles extremely helpful in completing my task.
I needed to determine the details of an MS Office Application such as the following:
- Full application EXE name
- Original filename
- Full application EXE path
- File version number
- Language
Using the Code
Usage is fairly straight forward. For testing purposes, I put a call in the forms load event.
Private Sub frmOfficeVersion_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
ListAllOfficeVersions()
ListSpecificOfficeVersion(MSOfficeApp.Word_Application)
End Sub
The code follows:
Option Strict On
Imports Microsoft.Win32
Imports System.IO
Public Class frmOfficeVersion
Enum MSOfficeApp
Access_Application
Excel_Application
Outlook_Application
PowerPoint_Application
Word_Application
FrontPage_Application
End Enum
Enum Version
Version2007 = 12
Version2003 = 11
Version2002 = 10
Version2000 = 9
Version97 = 8
Version95 = 7
End Enum
Public Sub ListAllOfficeVersions()
Dim strApp As String = Nothing
For Each s As String In [Enum].GetNames(GetType(MSOfficeApp))
If Not IsNothing(GetComponentPath(CType([Enum].Parse(GetType(MSOfficeApp), s), _
MSOfficeApp), True)) Then
strApp = GetComponentPath(CType([Enum].Parse(GetType(MSOfficeApp), s), _
MSOfficeApp), True).ToString
Else
strApp = "Not Found Err."
End If
If File.Exists((strApp).ToUpper) Then
Dim _fileVersion As FileVersionInfo = FileVersionInfo.GetVersionInfo(strApp.ToUpper)
Debug.Print(s & vbTab & GetVersionsString(CType([Enum].Parse_
(GetType(MSOfficeApp), s), MSOfficeApp)))
Debug.Print("App Path Full = " & (strApp).ToUpper)
Debug.Print("App Exists: " & _fileVersion.ToString)
Else
Debug.Print(s & vbTab & GetVersionsString(CType([Enum].Parse_
(GetType(MSOfficeApp), s), MSOfficeApp)))
End If
Debug.Print(vbCrLf & "=================" & vbCrLf)
Next
End Sub
Public Sub ListSpecificOfficeVersion(ByVal MsApplication As MSOfficeApp)
Debug.Print(GetComponentPath(MsApplication))
Dim strApp As String = Nothing
If Not IsNothing(GetComponentPath(MsApplication, True)) Then
strApp = GetComponentPath(MsApplication, True).ToString
Else
strApp = "Not Found Err."
End If
If File.Exists((strApp).ToUpper) Then
Dim _fileVersion As FileVersionInfo = FileVersionInfo.GetVersionInfo(strApp.ToUpper)
Debug.Print(vbTab & GetVersionsString(MsApplication))
Debug.Print("App Path Full = " & (strApp).ToUpper)
Debug.Print("App Exists: " & _fileVersion.ToString)
Else
Debug.Print(vbTab & GetVersionsString(MsApplication))
End If
Debug.Print(vbCrLf & "=================" & vbCrLf)
End Sub
Public Shared Function GetVersionsID(ByVal app As MSOfficeApp) As Integer
Dim strProgID As String = [Enum].GetName(GetType(MSOfficeApp), app)
strProgID = Replace(strProgID, "_", ".")
Dim regKey As RegistryKey
regKey = Registry.LocalMachine.OpenSubKey("Software\Classes\" & strProgID & "\CurVer", False)
If IsNothing(regKey) Then Return 0
Dim strV As String = CStr(regKey.GetValue("", Nothing, RegistryValueOptions.None))
Debug.Print(strV)
regKey.Close()
strV = Replace(Replace(strV, strProgID, ""), ".", "")
Return CInt(strV)
End Function
Public Shared Function GetVersionsString(ByVal app As MSOfficeApp) As String
Dim strProgID As String = [Enum].GetName(GetType(MSOfficeApp), app)
strProgID = Replace(strProgID, "_", ".")
Dim regKey As RegistryKey
regKey = Registry.LocalMachine.OpenSubKey("Software\Classes\" & strProgID & "\CurVer", False)
If IsNothing(regKey) Then Return "No version detected."
Dim strV As String = CStr(regKey.GetValue("", Nothing, RegistryValueOptions.None))
regKey.Close()
strV = Replace(Replace(strV, strProgID, ""), ".", "")
Return [Enum].GetName(GetType(Version), CInt(strV))
End Function
Private Function GetComponentPath(ByVal _component As MSOfficeApp, _
Optional ByVal blnFullPath As Boolean = False) As String
Const RegKey As String = "Software\Microsoft\Windows\CurrentVersion\App Paths"
Dim toReturn As String = Nothing
Dim _key As String = Nothing
Select Case _component
Case MSOfficeApp.Word_Application
_key = "winword.exe"
Case MSOfficeApp.Excel_Application
_key = "excel.exe"
Case MSOfficeApp.PowerPoint_Application
_key = "powerpnt.exe"
Case MSOfficeApp.Outlook_Application
_key = "outlook.exe"
Case MSOfficeApp.Access_Application
_key = "MSACCESS.exe"
Case MSOfficeApp.FrontPage_Application
_key = "FrontPg.exe"
End Select
_key = _key.ToUpper
Dim _mainKey As RegistryKey = Registry.CurrentUser
Try
_mainKey = _mainKey.OpenSubKey(RegKey & "\" & _key, False)
If _mainKey IsNot Nothing Then
toReturn = _mainKey.GetValue(String.Empty).ToString()
If blnFullPath Then toReturn = toReturn & _key
End If
Catch
End Try
_mainKey = Registry.LocalMachine
If String.IsNullOrEmpty(toReturn) Then
Try
_mainKey = _mainKey.OpenSubKey(RegKey & "\" & _key, False)
If _mainKey IsNot Nothing Then
toReturn = _mainKey.GetValue("Path").ToString()
If blnFullPath Then toReturn = toReturn & _key
End If
Catch
End Try
End If
If _mainKey IsNot Nothing Then
_mainKey.Close()
End If
Return toReturn
End Function
Private Sub frmOfficeVersion_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
ListSpecificOfficeVersion(MSOfficeApp.Word_Application)
End Sub
End Class
Which then returns an output similar to the following:
=================
Word_Application Version2003
App Path Full = C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE11\WINWORD.EXE
App Exists: File: C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE11\WINWORD.EXE
InternalName: WinWord
OriginalFilename: WinWord.exe
FileVersion: 11.0.8345
FileDescription: Microsoft Office Word
Product: Microsoft Office 2003
ProductVersion: 11.0.8345
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: Language Neutral
=================
FrontPage_Application No version detected.
=================
C:\Program Files\Microsoft Office\OFFICE11\
C:\Program Files\Microsoft Office\OFFICE11\Version2003
App Path Full = C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE11\WINWORD.EXE
App Exists: File: C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE11\WINWORD.EXE
InternalName: WinWord
OriginalFilename: WinWord.exe
FileVersion: 11.0.8345
FileDescription: Microsoft Office Word
Product: Microsoft Office 2003
ProductVersion: 11.0.8345
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: Language Neutral
Points of Interest
Once again, full credit goes to Warren Stevens, Daneil Leykauf and Niskof here at codeproject.com.
Thank you for reading!
At some point, I may need to rework this into a C# class for which I will post an update here.
History
Again this is my first article. Thanks to all the helpful people here at codeproject.com.
C# Update
Thank you everyone for you suggestions. Here is a quick conversion to C#.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using System.Collections;
using System.Diagnostics;
using Microsoft.Win32;
using System.IO;
namespace csOfficeVersion
{
public partial class frmOfficeVersion : Form
{
public frmOfficeVersion()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ListAllOfficeVersions();
}
public enum MSOfficeApp
{
Access_Application,
Excel_Application,
Outlook_Application,
PowerPoint_Application,
Word_Application,
FrontPage_Application
}
public enum Version
{
Version2007 = 12,
Version2003 = 11,
Version2002 = 10,
Version2000 = 9,
Version97 = 8,
Version95 = 7
}
public void ListAllOfficeVersions()
{
string strApp = null;
foreach (string s in Enum.GetNames(typeof(MSOfficeApp)))
{
if ((GetComponentPath((MSOfficeApp)Enum.Parse_
(typeof(MSOfficeApp), s), true) != null))
{
strApp = GetComponentPath((MSOfficeApp)Enum.Parse_
(typeof(MSOfficeApp), s), true).ToString();
}
else
{
strApp = "Not Found Err.";
}
if (File.Exists((strApp).ToUpper()))
{
FileVersionInfo _fileVersion = _
FileVersionInfo.GetVersionInfo(strApp.ToUpper());
Debug.Print(s + "\t" + _
GetVersionsString((MSOfficeApp)Enum.Parse(typeof(MSOfficeApp), s)));
Debug.Print("App Path Full = " + (strApp).ToUpper());
Debug.Print("App Exists: " + _fileVersion.ToString());
}
else
{
Debug.Print(s + "\t" + _
GetVersionsString((MSOfficeApp)Enum.Parse(typeof(MSOfficeApp), s)));
}
Debug.Print("\n" + "=================" + "\n");
}
}
public void ListSpecificOfficeVersion(MSOfficeApp MsApplication)
{
Debug.Print(GetComponentPath(MsApplication));
string strApp = null;
if ((GetComponentPath(MsApplication, true) != null))
{
strApp = GetComponentPath(MsApplication, true).ToString();
}
else
{
strApp = "Not Found Err.";
}
if (File.Exists((strApp).ToUpper()))
{
FileVersionInfo _fileVersion = FileVersionInfo.GetVersionInfo(strApp.ToUpper());
Debug.Print("\t" + GetVersionsString(MsApplication));
Debug.Print("App Path Full = " + (strApp).ToUpper());
Debug.Print("App Exists: " + _fileVersion.ToString());
}
else
{
Debug.Print("\t" + GetVersionsString(MsApplication));
}
Debug.Print("\n" + "=================" + "\n");
}
public static int GetVersionsID(MSOfficeApp app)
{
string strProgID = Enum.GetName(typeof(MSOfficeApp), app);
strProgID = strProgID.Replace("_", ".");
RegistryKey regKey = null;
regKey = Registry.LocalMachine.OpenSubKey_
("Software\\Classes\\" + strProgID + "\\CurVer", false);
if ((regKey == null))
return 0;
string strV = Convert.ToString(regKey.GetValue("", null, RegistryValueOptions.None));
Debug.Print(strV);
regKey.Close();
strV = strV.Replace(strProgID, "");
strV = strV.Replace(".", "");
return Convert.ToInt32(strV);
}
public static string GetVersionsString(MSOfficeApp app)
{
string strProgID = Enum.GetName(typeof(MSOfficeApp), app);
strProgID = strProgID.Replace("_", ".");
RegistryKey regKey = null;
regKey = Registry.LocalMachine.OpenSubKey_
("Software\\Classes\\" + strProgID + "\\CurVer", false);
if ((regKey == null))
return "No version detected.";
string strV = Convert.ToString(regKey.GetValue("", null, RegistryValueOptions.None));
regKey.Close();
strV = strV.Replace(strProgID, "");
strV = strV.Replace(".", "");
return Enum.GetName(typeof(Version), Convert.ToInt32(strV));
}
private string GetComponentPath(MSOfficeApp _component, bool blnFullPath = false)
{
const string RegKey = "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths";
string toReturn = null;
string _key = null;
switch (_component)
{
case MSOfficeApp.Word_Application:
_key = "winword.exe";
break;
case MSOfficeApp.Excel_Application:
_key = "excel.exe";
break;
case MSOfficeApp.PowerPoint_Application:
_key = "powerpnt.exe";
break;
case MSOfficeApp.Outlook_Application:
_key = "outlook.exe";
break;
case MSOfficeApp.Access_Application:
_key = "MSACCESS.exe";
break;
case MSOfficeApp.FrontPage_Application:
_key = "FrontPg.exe";
break;
}
_key = _key.ToUpper();
RegistryKey _mainKey = Registry.CurrentUser;
try
{
_mainKey = _mainKey.OpenSubKey(RegKey + "\\" + _key, false);
if (_mainKey != null)
{
toReturn = _mainKey.GetValue(string.Empty).ToString();
if (blnFullPath)
toReturn = toReturn + _key;
}
}
catch
{
}
_mainKey = Registry.LocalMachine;
if (string.IsNullOrEmpty(toReturn))
{
try
{
_mainKey = _mainKey.OpenSubKey(RegKey + "\\" + _key, false);
if (_mainKey != null)
{
toReturn = _mainKey.GetValue("Path").ToString();
if (blnFullPath)
toReturn = toReturn + _key;
}
}
catch
{
}
}
if (_mainKey != null)
{
_mainKey.Close();
}
return toReturn;
}
}}