Get OCX version

Using .NET, how can I determine the the version when given some file "XYZ.ocx"?
LVL 12
farsightAsked:
Who is Participating?
 
caner_elciConnect With a Mentor Commented:
Here, I converted this function from one of my old MFC applications. It works well.. but you should do some error handling if you want.. I just skipped that by a try-catch and didn't check the return values of API calls... Anyway, it's an unsafe code in .NET, so you should compile with /unsafe option (you can set it in project properties)

[DllImport("version.dll")]
public static extern bool GetFileVersionInfo (string sFileName, int handle, int size, byte[] infoBuffer);
[DllImport("version.dll")]
public static extern int GetFileVersionInfoSize (string sFileName, out int handle);
[DllImport("version.dll")]
unsafe public static extern bool VerQueryValue (byte[] pBlock, string pSubBlock, out string pValue, out uint len);
[DllImport("version.dll")]
unsafe public static extern bool VerQueryValue (byte[] pBlock, string pSubBlock, out short *pValue, out uint len);

unsafe public string GetFileVersion( string fileName )
{
    try
    {
        int handle = 0;
        int size = GetFileVersionInfoSize( fileName, out handle );
        if( size == 0 )
            return "Cannot get version info size";
        byte[] buff = new byte[size];
        GetFileVersionInfo( fileName, handle, size, buff );
        short *pSubBlock = null;
        uint len = 0;
        VerQueryValue( buff, @"\VarFileInfo\Translation", out pSubBlock, out len );
        string prodVer = @"\StringFileInfo\" + pSubBlock[0].ToString( "X4" ) + pSubBlock[1].ToString( "X4" ) + @"\ProductVersion";
        byte *pVersion = null;
        string versionInfo;
        VerQueryValue( buff, prodVer, out versionInfo, out len );
        return versionInfo;
    }
    catch( Exception ex )
    {
        return ex.ToString();
    }
}


Caner ELCI
0
 
farsightAuthor Commented:
I found this on my own.  I'm checking to see if the results are the same.

---

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDiagnosticsFileVersionInfoClassGetVersionInfoTopic.asp

Here's VB.NET Sample code. I tried to pick OCXes I thought would be on your system.  It shows the "Product Version", not the "File Version", at least in cases like comdlg32.ocx.

comdlg32.ocx
  File    Version: 6.00.88.77
  Product Version: 6.00.8877

--- VB.NET ---

    Public Shared Sub Test_GetFileVersion()
        Dim filenames As String() = New String() { _
            "%systemroot%\Notepad.exe", _
            "%systemroot%\comctl32.ocx", _
            "%systemroot%\comdlg32.ocx", _
            "%systemroot%\mci32.ocx", _
            "%systemroot%\MSCOMM32.ocx", _
            "%systemroot%\mswinsck.ocx", _
            "%systemroot%\richtx32.ocx", _
            "%systemroot%\sysinfo.ocx", _
            "%systemroot%\sysmon.ocx", _
            "noSuchFile.ocx" _
            }

        For Each filename As String In filenames
            Try
                ' Get the file version for the notepad.
                Dim myFileVersionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo( _
                    filename.Replace("%systemroot%", System.Environment.SystemDirectory))
                ' Print the file name and version number.
                Debug.WriteLine("Filename: " & filename & System.Environment.NewLine & _
                    "  File: " & myFileVersionInfo.FileDescription & System.Environment.NewLine & _
                    "  Version number: " & myFileVersionInfo.FileVersion)
            Catch
                Debug.WriteLine("File: " & filename & " -- not found.")
            End Try
        Next
    End Sub

--- Output ---

Filename: %systemroot%\Notepad.exe
  File: Notepad
  Version number: 5.00.2140.1
Filename: %systemroot%\comctl32.ocx
  File: Windows Common Controls ActiveX Control DLL
  Version number: 6.00.8022
Filename: %systemroot%\comdlg32.ocx
  File: CMDialog ActiveX Control DLL
  Version number: 6.00.8877
Filename: %systemroot%\mci32.ocx
  File: MCI OLE Control DLL
  Version number: 6.00.8418
Filename: %systemroot%\MSCOMM32.ocx
  File: MSComm
  Version number: 6.00.8169
Filename: %systemroot%\mswinsck.ocx
  File: Microsoft Winsock Control DLL
  Version number: 6.00.8877
Filename: %systemroot%\richtx32.ocx
  File: RichTx32.OCX
  Version number: 6.00.8877
Filename: %systemroot%\sysinfo.ocx
  File: SysInfo
  Version number: 6.00.8877
Filename: %systemroot%\sysmon.ocx
  File: System Monitor Control
  Version number: 5.00.2195.6660
File: noSuchFile.ocx -- not found.

0
 
farsightAuthor Commented:
I added a little driver to your code, and tried it.
It does indeed produce the same results.
Thanks for the effort.

--- driver --- C# ---

            unsafe public void Test_GetFileVersion()
            {
                  String[] filenames = {
                        @"%systemroot%\Notepad.exe",
                        @"%systemroot%\comctl32.ocx",
                        @"%systemroot%\comdlg32.ocx",
                        @"%systemroot%\mci32.ocx",
                        @"%systemroot%\MSCOMM32.ocx",
                        @"%systemroot%\mswinsck.ocx",
                        @"%systemroot%\richtx32.ocx",
                        @"%systemroot%\sysinfo.ocx",
                        @"%systemroot%\sysmon.ocx",
                        @"noSuchFile.ocx"
                  };

                  foreach (String filename in filenames)
                  {
                        try
                        {
                              // Get the file version for the notepad.
                              string version = GetFileVersion(filename.Replace("%systemroot%", System.Environment.SystemDirectory));
                              // Print the file name and version number.
                              Debug.WriteLine("Filename: " + filename + System.Environment.NewLine +
                                    "  Version number: " + version);
                        }
                        catch (Exception ex)
                        {
                              Debug.WriteLine("File: " + filename + " -- not found.");
                        }
                  } // foreach
            } // Test_GetFileVersion

--- Output ---

Filename: %systemroot%\Notepad.exe
  Version number: 5.00.2140.1
Filename: %systemroot%\comctl32.ocx
  Version number: 6.00.8022
Filename: %systemroot%\comdlg32.ocx
  Version number: 6.00.8877
Filename: %systemroot%\mci32.ocx
  Version number: 6.00.8418
Filename: %systemroot%\MSCOMM32.ocx
  Version number: 6.00.8169
Filename: %systemroot%\mswinsck.ocx
  Version number: 6.00.8877
Filename: %systemroot%\richtx32.ocx
  Version number: 6.00.8877
Filename: %systemroot%\sysinfo.ocx
  Version number: 6.00.8877
Filename: %systemroot%\sysmon.ocx
  Version number: 5.00.2195.6660
Filename: noSuchFile.ocx
  Version number: Cannot get version info size
0
 
farsightAuthor Commented:
caner_elci,
Please post a tiny "I answered that question." message at this link, so I can give you those points, too.
http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_20949611.html
0
 
caner_elciCommented:
Ok, done.. Have a nice coding..

Caner
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.