获取OCX的版本号

本文介绍了如何获取OCX控件的版本号。首先,通过OCX的CLSID在注册表找到相应位置;接着,读取InprocServer32键获取OCX的注册路径;最后,使用API函数GetFileVersionInfoSize和VerQueryValue获取并格式化版本号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 ocx一般会在注册表中注册一个CLSID,一般在HKEY_LOCAL_MACHINE/SOFTWARE/CLASSES/CLSID
下。
        读取ocx的版本号主要分为以下几个步骤:
1.获得ocxCLSID
有些ocx提供GetClsid函数,该函数的功能是返回其CLSID结构,然后下面的程序将该CLSID结构进行解析:
GetCLSID()
{
              CLSID clsid;
              memset(&clsid,0,sizeof(CLSID));
              clsid = m_pXCDFRDCtrl->GetClsid();//m_pXCDFRDCtrl为ocx控件的指针
              CString sid = "";
              CString lastid = "";
              lastid.Format("%X%X-%X%X%X%X%X%X}",clsid.Data4[0],clsid.Data4[1],
                            clsid.Data4[2],clsid.Data4[3],clsid.Data4[4],clsid.Data4[5],
                            clsid.Data4[6],clsid.Data4[7]);
              sid.Format("{%X-%X-%X-",clsid.Data1,clsid.Data2,clsid.Data3);
              sid += lastid;
              return sid;
}
这里解析出来的sid为{68A2CDE0-F378-46E2-9446-BC4179CCF339},一般CLSID在注册表的如下位置中:
HKEY_LOCAL_MACHINE/SOFTWARE/Classes/CLSID/
2.获得ocx的注册路径
读注册表中的值
程序如下:
GetOcxPath(const CString clsid)
{
              HKEY key;
              DWORD dwType;
              CString RegDir;
              char szPath[MAX_PATH] = {0};
              DWORD dwSize = MAX_PATH;
              LONG lReturn = ERROR_SUCCESS;
              RegDir.LoadString(IDS_OCX_PATH); //这里的IDS_OCX_PATH为
                                                                                   // HKEY_LOCAL_MACHINE/SOFTWARE/Classes/CLSID/
              RegDir += clsid;
              RegDir += "//InprocServer32";
             
              lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegDir, 0, KEY_QUERY_VALUE, &key);
              lReturn = RegQueryValueEx(key, NULL, NULL, &dwType, (LPBYTE)szPath, &dwSize);
              return szPath;
}
这里的注册表键InprocServer32存储了ocx的注册路径,读取到szPath中返回。
3.获得ocx的版本号
完成此功能的API函数为GetFileVersion(ocxPath),这里的ocxPath是指步骤2返回的注册路径
GetFileVersion(CString& strFileName)
{
              CString strTempName = strFileName;
              DWORD   dwFileType = VFT_UNKNOWN;    
              DWORD   dwVerInfoBytes;    
              DWORD   dwHandle;    
              LPBYTE pVerInfo    = NULL;    
              VS_FIXEDFILEINFO*   pFixedFileInfo   =   NULL;    
              UINT   uiLength;    
              HRESULT hResult                         =   S_OK;  
              char* pBuffer = NULL;
              CString strVersion = "";
 //Call this API first to get the Version
dwVerInfoBytes = GetFileVersionInfoSize(strTempName.GetBuffer(0),&dwHandle);    
              if   (dwVerInfoBytes   ==   0)    
                            return   HRESULT_FROM_WIN32(::GetLastError());       
              //Allocate memory to hold the version information for the specified file.    
              try    
              {    
                            pVerInfo = new BYTE[dwVerInfoBytes];    
              }    
              catch(CMemoryException* e)    
              {    
                            e->Delete();          
              }
    if(::GetFileVersionInfo(strTempName.GetBuffer(0),0,dwVerInfoBytes,pVerInfo)   && ::VerQueryValue(pVerInfo, _T("//"), (LPVOID*)&pFixedFileInfo, &uiLength))     
              {
                  //format the version number into the format such as 2.1.0.0
                   strVersion.Format("%d.%d.%d.%d",
HIWORD(pFixedFileInfo->dwFileVersionMS), LOWORD(pFixedFileInfo->dwFileVersionMS),
HIWORD(pFixedFileInfo->dwFileVersionLS),
                  LOWORD(pFixedFileInfo->dwFileVersionLS));        
return strVersion;
}
这里返回的strVersion即是ocx的版本号!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值