Solved

Get OCX version

Posted on 2004-04-10
5
828 Views
Last Modified: 2007-12-19
Using .NET, how can I determine the the version when given some file "XYZ.ocx"?
0
Comment
Question by:farsight
  • 3
  • 2
5 Comments
 
LVL 4

Accepted Solution

by:
caner_elci earned 125 total points
ID: 10796497
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
 
LVL 12

Author Comment

by:farsight
ID: 10796648
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
 
LVL 12

Author Comment

by:farsight
ID: 10796668
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
 
LVL 12

Author Comment

by:farsight
ID: 10796696
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
 
LVL 4

Expert Comment

by:caner_elci
ID: 10796897
Ok, done.. Have a nice coding..

Caner
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Summary Displaying images in RichTextBox is a common requirement with limited solutions available. Pasting through clipboard or embedding into RTF content only support static images.  This article describes how to insert Windows control objects int…
A basic question.. “What is the Garbage Collector?” The usual answer given back: “Garbage collector is a background thread run by the CLR for freeing up the memory space used by the objects which are no longer used by the program.” I wondered …
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now